From: Daniel Dunbar Date: Thu, 12 Nov 2009 01:36:27 +0000 (+0000) Subject: clang-cc: Move non-Consumer action handling to common location, to expose the massive... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e1bcb0ad31bf1ba3bf70a3e595a10c5c3b00c50;p=clang clang-cc: Move non-Consumer action handling to common location, to expose the massive amount of redundancy we have introduced through blind copy-and-paste. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86922 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index f6eec11c1c..f6b38dfe15 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -678,41 +678,15 @@ static void ProcessInputFile(const CompilerInvocation &CompOpts, CompleteTranslationUnit = false; break; } - case DumpRawTokens: { - llvm::TimeRegion Timer(ClangFrontendTimer); - SourceManager &SM = PP.getSourceManager(); - // Start lexing the specified input file. - Lexer RawLex(SM.getMainFileID(), SM, PP.getLangOptions()); - RawLex.SetKeepWhitespaceMode(true); - Token RawTok; - RawLex.LexFromRawLexer(RawTok); - while (RawTok.isNot(tok::eof)) { - PP.DumpToken(RawTok, true); - fprintf(stderr, "\n"); - RawLex.LexFromRawLexer(RawTok); - } - ClearSourceMgr = true; - break; - } - case DumpTokens: { // Token dump mode. - llvm::TimeRegion Timer(ClangFrontendTimer); - Token Tok; - // Start preprocessing the specified input file. - PP.EnterMainSourceFile(); - do { - PP.Lex(Tok); - PP.DumpToken(Tok, true); - fprintf(stderr, "\n"); - } while (Tok.isNot(tok::eof)); - ClearSourceMgr = true; - break; - } + // Do any necessary set up for non-consumer actions. + case DumpRawTokens: + case DumpTokens: case RunPreprocessorOnly: - break; + case ParseNoop: + break; // No setup. - case GeneratePTH: { - llvm::TimeRegion Timer(ClangFrontendTimer); + case GeneratePTH: if (CompOpts.getOutputFile().empty() || CompOpts.getOutputFile() == "-") { // FIXME: Don't fail this way. // FIXME: Verify that we can actually seek in the given file. @@ -720,36 +694,13 @@ static void ProcessInputFile(const CompilerInvocation &CompOpts, ::exit(1); } OS.reset(ComputeOutFile(CompOpts, InFile, 0, true, OutPath)); - CacheTokens(PP, static_cast(OS.get())); - ClearSourceMgr = true; break; - } case PrintPreprocessedInput: - OS.reset(ComputeOutFile(CompOpts, InFile, 0, true, OutPath)); - break; - - case ParseNoop: - break; - - case ParsePrintCallbacks: { - llvm::TimeRegion Timer(ClangFrontendTimer); - OS.reset(ComputeOutFile(CompOpts, InFile, 0, true, OutPath)); - ParseFile(PP, CreatePrintParserActionsAction(PP, OS.get())); - ClearSourceMgr = true; - break; - } - + case ParsePrintCallbacks: case RewriteMacros: - OS.reset(ComputeOutFile(CompOpts, InFile, 0, true, OutPath)); - RewriteMacrosInInput(PP, OS.get()); - ClearSourceMgr = true; - break; - case RewriteTest: OS.reset(ComputeOutFile(CompOpts, InFile, 0, true, OutPath)); - DoRewriteTest(PP, OS.get()); - ClearSourceMgr = true; break; } @@ -871,18 +822,45 @@ static void ProcessInputFile(const CompilerInvocation &CompOpts, switch (PA) { default: break; - case RunPreprocessorOnly: { // Just lex as fast as we can, no output. + case DumpRawTokens: { + llvm::TimeRegion Timer(ClangFrontendTimer); + SourceManager &SM = PP.getSourceManager(); + // Start lexing the specified input file. + Lexer RawLex(SM.getMainFileID(), SM, PP.getLangOptions()); + RawLex.SetKeepWhitespaceMode(true); + + Token RawTok; + RawLex.LexFromRawLexer(RawTok); + while (RawTok.isNot(tok::eof)) { + PP.DumpToken(RawTok, true); + fprintf(stderr, "\n"); + RawLex.LexFromRawLexer(RawTok); + } + ClearSourceMgr = true; + break; + } + + case DumpTokens: { llvm::TimeRegion Timer(ClangFrontendTimer); Token Tok; - // Start parsing the specified input file. + // Start preprocessing the specified input file. PP.EnterMainSourceFile(); do { PP.Lex(Tok); + PP.DumpToken(Tok, true); + fprintf(stderr, "\n"); } while (Tok.isNot(tok::eof)); ClearSourceMgr = true; break; } + case GeneratePTH: { + llvm::TimeRegion Timer(ClangFrontendTimer); + CacheTokens(PP, static_cast(OS.get())); + ClearSourceMgr = true; + break; + } + case ParseNoop: { llvm::TimeRegion Timer(ClangFrontendTimer); ParseFile(PP, new MinimalAction(PP)); @@ -890,11 +868,45 @@ static void ProcessInputFile(const CompilerInvocation &CompOpts, break; } + case ParsePrintCallbacks: { + llvm::TimeRegion Timer(ClangFrontendTimer); + ParseFile(PP, CreatePrintParserActionsAction(PP, OS.get())); + ClearSourceMgr = true; + break; + } + case PrintPreprocessedInput: { llvm::TimeRegion Timer(ClangFrontendTimer); DoPrintPreprocessedInput(PP, OS.get(), CompOpts.getPreprocessorOutputOpts()); ClearSourceMgr = true; + break; + } + + case RewriteMacros: { + llvm::TimeRegion Timer(ClangFrontendTimer); + RewriteMacrosInInput(PP, OS.get()); + ClearSourceMgr = true; + break; + } + + case RewriteTest: { + llvm::TimeRegion Timer(ClangFrontendTimer); + DoRewriteTest(PP, OS.get()); + ClearSourceMgr = true; + break; + } + + case RunPreprocessorOnly: { // Just lex as fast as we can, no output. + llvm::TimeRegion Timer(ClangFrontendTimer); + Token Tok; + // Start parsing the specified input file. + PP.EnterMainSourceFile(); + do { + PP.Lex(Tok); + } while (Tok.isNot(tok::eof)); + ClearSourceMgr = true; + break; } }