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