//===- ToolOutputFile.cpp -------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include <mcld/Support/ToolOutputFile.h> #include <mcld/Support/Path.h> #include <mcld/Support/FileHandle.h> #include <mcld/Support/MemoryArea.h> #include <mcld/Support/raw_mem_ostream.h> #include <mcld/Support/SystemUtils.h> #include <mcld/Support/MsgHandling.h> #include <llvm/Support/Signals.h> #include <llvm/Support/Path.h> #include <llvm/Support/FormattedStream.h> using namespace mcld; //===----------------------------------------------------------------------===// // CleanupInstaller //===----------------------------------------------------------------------===// ToolOutputFile::CleanupInstaller::CleanupInstaller(const std::string& pName) : Keep(false), m_Filename(pName) { // Arrange for the file to be deleted if the process is killed. if (m_Filename != "-") llvm::sys::RemoveFileOnSignal(llvm::sys::Path(m_Filename)); } ToolOutputFile::CleanupInstaller::~CleanupInstaller() { // Delete the file if the client hasn't told us not to. if (!Keep && m_Filename != "-") llvm::sys::Path(m_Filename).eraseFromDisk(); // Ok, the file is successfully written and closed, or deleted. There's no // further need to clean it up on signals. if (m_Filename != "-") llvm::sys::DontRemoveFileOnSignal(llvm::sys::Path(m_Filename)); } //===----------------------------------------------------------------------===// // ToolOutputFile //===----------------------------------------------------------------------===// ToolOutputFile::ToolOutputFile(const sys::fs::Path& pPath, FileHandle::OpenMode pMode, FileHandle::Permission pPermission) : m_Installer(pPath.native()), m_pMemoryArea(NULL), m_pOStream(NULL), m_pFOStream(NULL) { if (!m_FileHandle.open(pPath, pMode, pPermission)) { // If open fails, no clean-up is needed. m_Installer.Keep = true; fatal(diag::err_cannot_open_output_file) << pPath << sys::strerror(m_FileHandle.error()); return; } m_pMemoryArea = new MemoryArea(m_FileHandle); m_pOStream = new raw_mem_ostream(*m_pMemoryArea); } ToolOutputFile::~ToolOutputFile() { delete m_pFOStream; delete m_pOStream; delete m_pMemoryArea; } void ToolOutputFile::keep() { m_Installer.Keep = true; } /// mem_os - Return the contained raw_mem_ostream. raw_mem_ostream& ToolOutputFile::mem_os() { assert(NULL != m_pOStream); return *m_pOStream; } /// formatted_os - Return the containeed formatted_raw_ostream. /// Since formatted_os is rarely used, we lazily initialize it. llvm::formatted_raw_ostream& ToolOutputFile::formatted_os() { if (NULL == m_pFOStream) { assert(NULL != m_pOStream); m_pFOStream = new llvm::formatted_raw_ostream(*m_pOStream); } return *m_pFOStream; } /// memory - Return the contained MemoryArea. MemoryArea& ToolOutputFile::memory() { assert(NULL != m_pOStream); return m_pOStream->getMemoryArea(); }