Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Support/FileUtilities.h
Line
Count
Source (jump to first uncovered line)
1
//===- llvm/Support/FileUtilities.h - File System Utilities -----*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file defines a family of utility functions which are useful for doing
10
// various things with files.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_SUPPORT_FILEUTILITIES_H
15
#define LLVM_SUPPORT_FILEUTILITIES_H
16
17
#include "llvm/Support/FileSystem.h"
18
#include "llvm/Support/Path.h"
19
20
namespace llvm {
21
22
  /// DiffFilesWithTolerance - Compare the two files specified, returning 0 if
23
  /// the files match, 1 if they are different, and 2 if there is a file error.
24
  /// This function allows you to specify an absolute and relative FP error that
25
  /// is allowed to exist.  If you specify a string to fill in for the error
26
  /// option, it will set the string to an error message if an error occurs, or
27
  /// if the files are different.
28
  ///
29
  int DiffFilesWithTolerance(StringRef FileA,
30
                             StringRef FileB,
31
                             double AbsTol, double RelTol,
32
                             std::string *Error = nullptr);
33
34
35
  /// FileRemover - This class is a simple object meant to be stack allocated.
36
  /// If an exception is thrown from a region, the object removes the filename
37
  /// specified (if deleteIt is true).
38
  ///
39
  class FileRemover {
40
    SmallString<128> Filename;
41
    bool DeleteIt;
42
  public:
43
    FileRemover() : DeleteIt(false) {}
44
45
    explicit FileRemover(const Twine& filename, bool deleteIt = true)
46
24
      : DeleteIt(deleteIt) {
47
24
      filename.toVector(Filename);
48
24
    }
49
50
1.57k
    ~FileRemover() {
51
1.57k
      if (DeleteIt) {
52
1.57k
        // Ignore problems deleting the file.
53
1.57k
        sys::fs::remove(Filename);
54
1.57k
      }
55
1.57k
    }
56
57
    /// setFile - Give ownership of the file to the FileRemover so it will
58
    /// be removed when the object is destroyed.  If the FileRemover already
59
    /// had ownership of a file, remove it first.
60
    void setFile(const Twine& filename, bool deleteIt = true) {
61
      if (DeleteIt) {
62
        // Ignore problems deleting the file.
63
        sys::fs::remove(Filename);
64
      }
65
66
      Filename.clear();
67
      filename.toVector(Filename);
68
      DeleteIt = deleteIt;
69
    }
70
71
    /// releaseFile - Take ownership of the file away from the FileRemover so it
72
    /// will not be removed when the object is destroyed.
73
0
    void releaseFile() { DeleteIt = false; }
74
  };
75
} // End llvm namespace
76
77
#endif