blob: e0e8752d74d8e401ba0da645168d30c6d1e8cfc6 [file] [log] [blame]
//===- ToolOutputFile.h ---------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SUPPORT_TOOL_OUTPUT_FILE_H
#define MCLD_SUPPORT_TOOL_OUTPUT_FILE_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <string>
#include <mcld/Support/FileHandle.h>
namespace llvm {
class formatted_raw_ostream;
} // end of namespace llvm
namespace mcld {
class Path;
class FileHandle;
class MemoryArea;
class raw_mem_ostream;
/** \class ToolOutputFile
* \brief ToolOutputFile contains a raw_mem_ostream and adds extra new
* features:
* - The file is automatically deleted if the process is killed.
* - The file is automatically deleted when the TooOutputFile object is
* destoryed unless the client calls keep().
*/
class ToolOutputFile
{
public:
ToolOutputFile(const sys::fs::Path& pPath,
FileHandle::OpenMode pMode,
FileHandle::Permission pPermission);
~ToolOutputFile();
/// mem_os - Return the contained raw_mem_ostream.
raw_mem_ostream &mem_os();
/// os - Return the contained formatted_raw_ostream
llvm::formatted_raw_ostream& formatted_os();
/// memory - Return the contained MemoryArea.
MemoryArea& memory();
/// keep - Indicate that the tool's job wrt this output file has been
/// successful and the file should not be deleted.
void keep();
private:
class CleanupInstaller
{
public:
explicit CleanupInstaller(const std::string& pFilename);
~CleanupInstaller();
/// Keep - The flag which indicates whether we should not delete the file.
bool Keep;
private:
std::string m_Filename;
};
private:
FileHandle m_FileHandle;
CleanupInstaller m_Installer;
MemoryArea* m_pMemoryArea;
raw_mem_ostream* m_pOStream;
llvm::formatted_raw_ostream* m_pFOStream;
};
} // namespace of mcld
#endif