10b57cec5SDimitry Andric //===--- ToolOutputFile.cpp - Implement the ToolOutputFile class --------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This implements the ToolOutputFile class. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "llvm/Support/ToolOutputFile.h" 140b57cec5SDimitry Andric #include "llvm/Support/FileSystem.h" 150b57cec5SDimitry Andric #include "llvm/Support/Signals.h" 160b57cec5SDimitry Andric using namespace llvm; 170b57cec5SDimitry Andric 185ffd83dbSDimitry Andric static bool isStdout(StringRef Filename) { return Filename == "-"; } 195ffd83dbSDimitry Andric 20*0fca6ea1SDimitry Andric CleanupInstaller::CleanupInstaller(StringRef Filename) 215ffd83dbSDimitry Andric : Filename(std::string(Filename)), Keep(false) { 220b57cec5SDimitry Andric // Arrange for the file to be deleted if the process is killed. 235ffd83dbSDimitry Andric if (!isStdout(Filename)) 240b57cec5SDimitry Andric sys::RemoveFileOnSignal(Filename); 250b57cec5SDimitry Andric } 260b57cec5SDimitry Andric 27*0fca6ea1SDimitry Andric CleanupInstaller::~CleanupInstaller() { 285ffd83dbSDimitry Andric if (isStdout(Filename)) 295ffd83dbSDimitry Andric return; 305ffd83dbSDimitry Andric 310b57cec5SDimitry Andric // Delete the file if the client hasn't told us not to. 325ffd83dbSDimitry Andric if (!Keep) 330b57cec5SDimitry Andric sys::fs::remove(Filename); 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric // Ok, the file is successfully written and closed, or deleted. There's no 360b57cec5SDimitry Andric // further need to clean it up on signals. 370b57cec5SDimitry Andric sys::DontRemoveFileOnSignal(Filename); 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric ToolOutputFile::ToolOutputFile(StringRef Filename, std::error_code &EC, 410b57cec5SDimitry Andric sys::fs::OpenFlags Flags) 425ffd83dbSDimitry Andric : Installer(Filename) { 435ffd83dbSDimitry Andric if (isStdout(Filename)) { 445ffd83dbSDimitry Andric OS = &outs(); 455ffd83dbSDimitry Andric EC = std::error_code(); 465ffd83dbSDimitry Andric return; 475ffd83dbSDimitry Andric } 485ffd83dbSDimitry Andric OSHolder.emplace(Filename, EC, Flags); 49bdd1243dSDimitry Andric OS = &*OSHolder; 500b57cec5SDimitry Andric // If open fails, no cleanup is needed. 510b57cec5SDimitry Andric if (EC) 520b57cec5SDimitry Andric Installer.Keep = true; 530b57cec5SDimitry Andric } 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric ToolOutputFile::ToolOutputFile(StringRef Filename, int FD) 565ffd83dbSDimitry Andric : Installer(Filename) { 575ffd83dbSDimitry Andric OSHolder.emplace(FD, true); 58bdd1243dSDimitry Andric OS = &*OSHolder; 595ffd83dbSDimitry Andric } 60