122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- ToolOutputFile.cpp -------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/ToolOutputFile.h> 1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Path.h> 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/FileHandle.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MemoryArea.h> 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/SystemUtils.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MsgHandling.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18283d8cbf5b3a6888c70f7931a54da9256e13d357Stephen Hines#include <llvm/Support/FileUtilities.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/Signals.h> 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/Path.h> 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/Support/FormattedStream.h> 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld; 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// CleanupInstaller 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 2887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesToolOutputFile::CleanupInstaller::CleanupInstaller(const sys::fs::Path& pPath) 29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines : Keep(false), m_Path(pPath) { 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Arrange for the file to be deleted if the process is killed. 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if ("-" != m_Path.native()) 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::sys::RemoveFileOnSignal(m_Path.native()); 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoToolOutputFile::CleanupInstaller::~CleanupInstaller() 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Delete the file if the client hasn't told us not to. 38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // FIXME: In Windows, some path in CJK characters can not be removed by LLVM 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // llvm::sys::Path 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (!Keep && "_" != m_Path.native()) { 4141f2d34f9d4efad1928e890acc5c2924b5033909Stephen Hines bool Existed = false; 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::sys::fs::remove(m_Path.native(), Existed); 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // Ok, the file is successfully written and closed, or deleted. There's no 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // further need to clean it up on signals. 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if ("_" != m_Path.native()) 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::sys::DontRemoveFileOnSignal(m_Path.native()); 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// ToolOutputFile 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 5487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesToolOutputFile::ToolOutputFile(const sys::fs::Path& pPath, 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FileHandle::OpenMode pMode, 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao FileHandle::Permission pPermission) 57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines : m_Installer(pPath), 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pFdOstream(NULL), 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pFormattedOstream(NULL) { 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!m_FileHandle.open(pPath, pMode, pPermission)) { 6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // If open fails, no clean-up is needed. 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Installer.Keep = true; 6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao fatal(diag::err_cannot_open_output_file) 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines << pPath 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines << sys::strerror(m_FileHandle.error()); 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return; 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoToolOutputFile::~ToolOutputFile() 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pFormattedOstream != NULL) 74551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pFormattedOstream; 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_pFdOstream != NULL) 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines delete m_pFdOstream; 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaovoid ToolOutputFile::keep() 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_Installer.Keep = true; 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/// os - Return the containeed raw_fd_ostream. 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/// Since os is rarely used, we lazily initialize it. 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesllvm::raw_fd_ostream& ToolOutputFile::os() 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_pFdOstream == NULL) { 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(m_FileHandle.isOpened() && 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_FileHandle.isGood() && 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_FileHandle.isWritable()); 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pFdOstream = new llvm::raw_fd_ostream(m_FileHandle.handler(), false); 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return *m_pFdOstream; 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/// formatted_os - Return the contained formatted_raw_ostream 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaollvm::formatted_raw_ostream& ToolOutputFile::formatted_os() 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_pFormattedOstream == NULL) { 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pFormattedOstream = new llvm::formatted_raw_ostream(os()); 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return *m_pFormattedOstream; 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 105