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