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