summaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/lib/Support/ToolOutputFile.cpp
blob: fa8b1e6758391554526af3323a278448c1c9ba9e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//===--- ToolOutputFile.cpp - Implement the ToolOutputFile class --------===// 
// 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
// See https://llvm.org/LICENSE.txt for license information. 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
// 
//===----------------------------------------------------------------------===// 
// 
// This implements the ToolOutputFile class. 
// 
//===----------------------------------------------------------------------===// 
 
#include "llvm/Support/ToolOutputFile.h" 
#include "llvm/Support/FileSystem.h" 
#include "llvm/Support/Signals.h" 
using namespace llvm; 
 
static bool isStdout(StringRef Filename) { return Filename == "-"; } 
 
ToolOutputFile::CleanupInstaller::CleanupInstaller(StringRef Filename) 
    : Filename(std::string(Filename)), Keep(false) { 
  // Arrange for the file to be deleted if the process is killed. 
  if (!isStdout(Filename)) 
    sys::RemoveFileOnSignal(Filename); 
} 
 
ToolOutputFile::CleanupInstaller::~CleanupInstaller() { 
  if (isStdout(Filename)) 
    return; 
 
  // Delete the file if the client hasn't told us not to. 
  if (!Keep) 
    sys::fs::remove(Filename); 
 
  // Ok, the file is successfully written and closed, or deleted. There's no 
  // further need to clean it up on signals. 
  sys::DontRemoveFileOnSignal(Filename); 
} 
 
ToolOutputFile::ToolOutputFile(StringRef Filename, std::error_code &EC, 
                               sys::fs::OpenFlags Flags) 
    : Installer(Filename) { 
  if (isStdout(Filename)) { 
    OS = &outs(); 
    EC = std::error_code(); 
    return; 
  } 
  OSHolder.emplace(Filename, EC, Flags); 
  OS = OSHolder.getPointer(); 
  // If open fails, no cleanup is needed. 
  if (EC) 
    Installer.Keep = true; 
} 
 
ToolOutputFile::ToolOutputFile(StringRef Filename, int FD) 
    : Installer(Filename) { 
  OSHolder.emplace(FD, true); 
  OS = OSHolder.getPointer(); 
}