| //===- 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(); |
| } |
| |