Author: AlexeySotkin Date: Fri Mar 2 04:11:40 2018 New Revision: 326566 URL: http://llvm.org/viewvc/llvm-project?rev=326566&view=rev Log: Add possibility to specify output stream for CompilerInstance
Patch by: krisb Reviewers: teemperor Reviewed By: teemperor Subscribers: klimek, mgorny, cfe-commits Differential Revision: https://reviews.llvm.org/D43809 Added: cfe/trunk/unittests/Frontend/OutputStreamTest.cpp Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h cfe/trunk/lib/CodeGen/CodeGenAction.cpp cfe/trunk/unittests/Frontend/CMakeLists.txt Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInstance.h?rev=326566&r1=326565&r2=326566&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/CompilerInstance.h (original) +++ cfe/trunk/include/clang/Frontend/CompilerInstance.h Fri Mar 2 04:11:40 2018 @@ -183,6 +183,9 @@ class CompilerInstance : public ModuleLo /// The list of active output files. std::list<OutputFile> OutputFiles; + /// Force an output buffer. + std::unique_ptr<llvm::raw_pwrite_stream> OutputStream; + CompilerInstance(const CompilerInstance &) = delete; void operator=(const CompilerInstance &) = delete; public: @@ -773,6 +776,14 @@ public: /// } + void setOutputStream(std::unique_ptr<llvm::raw_pwrite_stream> OutStream) { + OutputStream = std::move(OutStream); + } + + std::unique_ptr<llvm::raw_pwrite_stream> takeOutputStream() { + return std::move(OutputStream); + } + // Create module manager. void createModuleManager(); Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=326566&r1=326565&r2=326566&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Fri Mar 2 04:11:40 2018 @@ -846,7 +846,10 @@ GetOutputStream(CompilerInstance &CI, St std::unique_ptr<ASTConsumer> CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { BackendAction BA = static_cast<BackendAction>(Act); - std::unique_ptr<raw_pwrite_stream> OS = GetOutputStream(CI, InFile, BA); + std::unique_ptr<raw_pwrite_stream> OS = CI.takeOutputStream(); + if (!OS) + OS = GetOutputStream(CI, InFile, BA); + if (BA != Backend_EmitNothing && !OS) return nullptr; Modified: cfe/trunk/unittests/Frontend/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Frontend/CMakeLists.txt?rev=326566&r1=326565&r2=326566&view=diff ============================================================================== --- cfe/trunk/unittests/Frontend/CMakeLists.txt (original) +++ cfe/trunk/unittests/Frontend/CMakeLists.txt Fri Mar 2 04:11:40 2018 @@ -9,6 +9,7 @@ add_clang_unittest(FrontendTests CodeGenActionTest.cpp ParsedSourceLocationTest.cpp PCHPreambleTest.cpp + OutputStreamTest.cpp ) target_link_libraries(FrontendTests PRIVATE @@ -18,4 +19,5 @@ target_link_libraries(FrontendTests clangLex clangSema clangCodeGen + clangFrontendTool ) Added: cfe/trunk/unittests/Frontend/OutputStreamTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Frontend/OutputStreamTest.cpp?rev=326566&view=auto ============================================================================== --- cfe/trunk/unittests/Frontend/OutputStreamTest.cpp (added) +++ cfe/trunk/unittests/Frontend/OutputStreamTest.cpp Fri Mar 2 04:11:40 2018 @@ -0,0 +1,46 @@ +//===- unittests/Frontend/OutputStreamTest.cpp --- FrontendAction tests --===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "clang/CodeGen/BackendUtil.h" +#include "clang/CodeGen/CodeGenAction.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/FrontendTool/Utils.h" +#include "clang/Lex/PreprocessorOptions.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace clang; +using namespace clang::frontend; + +namespace { + +TEST(FrontendOutputTests, TestOutputStream) { + auto Invocation = std::make_shared<CompilerInvocation>(); + Invocation->getPreprocessorOpts().addRemappedFile( + "test.cc", MemoryBuffer::getMemBuffer("").release()); + Invocation->getFrontendOpts().Inputs.push_back( + FrontendInputFile("test.cc", InputKind::CXX)); + Invocation->getFrontendOpts().ProgramAction = EmitBC; + Invocation->getTargetOpts().Triple = "i386-unknown-linux-gnu"; + CompilerInstance Compiler; + + SmallVector<char, 256> IRBuffer; + std::unique_ptr<raw_pwrite_stream> IRStream( + new raw_svector_ostream(IRBuffer)); + + Compiler.setOutputStream(std::move(IRStream)); + Compiler.setInvocation(std::move(Invocation)); + Compiler.createDiagnostics(); + + bool Success = ExecuteCompilerInvocation(&Compiler); + EXPECT_TRUE(Success); + EXPECT_TRUE(!IRBuffer.empty()); + EXPECT_TRUE(StringRef(IRBuffer.data()).startswith("BC")); +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits