1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===- llvm/Support/FileUtilities.h - File System Utilities -----*- C++ -*-===// 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// The LLVM Compiler Infrastructure 4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===// 94181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner// 104181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner// This file defines a family of utility functions which are useful for doing 114181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner// various things with files. 124181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner// 134181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner//===----------------------------------------------------------------------===// 144181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner 15551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_FILEUTILITIES_H 16551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_FILEUTILITIES_H 174181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner 18c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer#include "llvm/Support/FileSystem.h" 191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Path.h" 204181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 23f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner /// DiffFilesWithTolerance - Compare the two files specified, returning 0 if 24f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner /// the files match, 1 if they are different, and 2 if there is a file error. 2556584fcbfd541c20b914f7cb58a38bf1a16f55c0Michael J. Spencer /// This function allows you to specify an absolute and relative FP error that 26f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner /// is allowed to exist. If you specify a string to fill in for the error 27f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner /// option, it will set the string to an error message if an error occurs, or 28f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner /// if the files are different. 29f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner /// 30bbf97ea7d5832922b3c40b67701b5719bfcb772bRafael Espindola int DiffFilesWithTolerance(StringRef FileA, 31bbf97ea7d5832922b3c40b67701b5719bfcb772bRafael Espindola StringRef FileB, 32f61c00167325fde6f7d0a179a15d601a3af0483dChris Lattner double AbsTol, double RelTol, 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::string *Error = nullptr); 34fc54a35956865c01578269ff2f6baf47758b572fChris Lattner 35fc54a35956865c01578269ff2f6baf47758b572fChris Lattner 36f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner /// FileRemover - This class is a simple object meant to be stack allocated. 37f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner /// If an exception is thrown from a region, the object removes the filename 38f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner /// specified (if deleteIt is true). 39f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner /// 40f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner class FileRemover { 41c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer SmallString<128> Filename; 42f5c8146a7cf899a678dc3979df6a3c99d7f19fc3Chris Lattner bool DeleteIt; 43f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner public: 44a5d0501b5935010c5db81e758baded607a861b30Dan Gohman FileRemover() : DeleteIt(false) {} 45a5d0501b5935010c5db81e758baded607a861b30Dan Gohman 46c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer explicit FileRemover(const Twine& filename, bool deleteIt = true) 47c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer : DeleteIt(deleteIt) { 48c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer filename.toVector(Filename); 49c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer } 5063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 51f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner ~FileRemover() { 520c33231eff17edbdabdb186e1fae718cf94b58b2Chris Lattner if (DeleteIt) { 530c33231eff17edbdabdb186e1fae718cf94b58b2Chris Lattner // Ignore problems deleting the file. 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sys::fs::remove(Filename.str()); 550c33231eff17edbdabdb186e1fae718cf94b58b2Chris Lattner } 56f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner } 57f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner 58132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman /// setFile - Give ownership of the file to the FileRemover so it will 59132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman /// be removed when the object is destroyed. If the FileRemover already 60132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman /// had ownership of a file, remove it first. 61c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer void setFile(const Twine& filename, bool deleteIt = true) { 62c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer if (DeleteIt) { 63c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer // Ignore problems deleting the file. 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sys::fs::remove(Filename.str()); 65c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer } 66132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman 67c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer Filename.clear(); 68c9c08fb3a7fb5e8ea3e1477a88507704c7a70ba1Michael J. Spencer filename.toVector(Filename); 69132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman DeleteIt = deleteIt; 70132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman } 71132a9946bf494f046ca61b95cea02a53804845c4Dan Gohman 72f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner /// releaseFile - Take ownership of the file away from the FileRemover so it 73f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner /// will not be removed when the object is destroyed. 74f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner void releaseFile() { DeleteIt = false; } 75f1e3285f3a45f21d237809a8da29558981282b56Chris Lattner }; 76d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 77d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 784181a4fb4f4853869a0b97460f8bc4838aa0cc81Chris Lattner#endif 79