LLVM  8.0.1
CodeGenCoverage.cpp
Go to the documentation of this file.
1 //===- lib/Support/CodeGenCoverage.cpp -------------------------------------==//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 /// \file
10 /// This file implements the CodeGenCoverage class.
11 //===----------------------------------------------------------------------===//
12 
14 
15 #include "llvm/Config/llvm-config.h"
16 #include "llvm/Support/Endian.h"
19 #include "llvm/Support/Mutex.h"
22 
23 #if LLVM_ON_UNIX
24 #include <unistd.h>
25 #elif defined(_WIN32)
26 #include <windows.h>
27 #endif
28 
29 using namespace llvm;
30 
32 
34 
35 void CodeGenCoverage::setCovered(uint64_t RuleID) {
36  if (RuleCoverage.size() <= RuleID)
37  RuleCoverage.resize(RuleID + 1, 0);
38  RuleCoverage[RuleID] = true;
39 }
40 
41 bool CodeGenCoverage::isCovered(uint64_t RuleID) const {
42  if (RuleCoverage.size() <= RuleID)
43  return false;
44  return RuleCoverage[RuleID];
45 }
46 
49  return RuleCoverage.set_bits();
50 }
51 
52 bool CodeGenCoverage::parse(MemoryBuffer &Buffer, StringRef BackendName) {
53  const char *CurPtr = Buffer.getBufferStart();
54 
55  while (CurPtr != Buffer.getBufferEnd()) {
56  // Read the backend name from the input.
57  const char *LexedBackendName = CurPtr;
58  while (*CurPtr++ != 0)
59  ;
60  if (CurPtr == Buffer.getBufferEnd())
61  return false; // Data is invalid, expected rule id's to follow.
62 
63  bool IsForThisBackend = BackendName.equals(LexedBackendName);
64  while (CurPtr != Buffer.getBufferEnd()) {
65  if (std::distance(CurPtr, Buffer.getBufferEnd()) < 8)
66  return false; // Data is invalid. Not enough bytes for another rule id.
67 
68  uint64_t RuleID = support::endian::read64(CurPtr, support::native);
69  CurPtr += 8;
70 
71  // ~0ull terminates the rule id list.
72  if (RuleID == ~0ull)
73  break;
74 
75  // Anything else, is recorded or ignored depending on whether it's
76  // intended for the backend we're interested in.
77  if (IsForThisBackend)
78  setCovered(RuleID);
79  }
80  }
81 
82  return true;
83 }
84 
86  StringRef BackendName) const {
87  if (!CoveragePrefix.empty() && !RuleCoverage.empty()) {
88  sys::SmartScopedLock<true> Lock(OutputMutex);
89 
90  // We can handle locking within a process easily enough but we don't want to
91  // manage it between multiple processes. Use the process ID to ensure no
92  // more than one process is ever writing to the same file at the same time.
93  std::string Pid =
94 #if LLVM_ON_UNIX
95  llvm::to_string(::getpid());
96 #elif defined(_WIN32)
97  llvm::to_string(::GetCurrentProcessId());
98 #else
99  "";
100 #endif
101 
102  std::string CoverageFilename = (CoveragePrefix + Pid).str();
103 
104  std::error_code EC;
106  std::unique_ptr<ToolOutputFile> CoverageFile =
107  llvm::make_unique<ToolOutputFile>(CoverageFilename, EC, OpenFlags);
108  if (EC)
109  return false;
110 
111  uint64_t Zero = 0;
112  uint64_t InvZero = ~0ull;
113  CoverageFile->os() << BackendName;
114  CoverageFile->os().write((const char *)&Zero, sizeof(unsigned char));
115  for (uint64_t I : RuleCoverage.set_bits())
116  CoverageFile->os().write((const char *)&I, sizeof(uint64_t));
117  CoverageFile->os().write((const char *)&InvZero, sizeof(uint64_t));
118 
119  CoverageFile->keep();
120  }
121 
122  return true;
123 }
124 
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition: BitVector.h:372
This class represents lattice values for constants.
Definition: AllocatorList.h:24
bool empty() const
empty - Tests whether there are no bits in this bitvector.
Definition: BitVector.h:167
SmartMutex - A mutex with a compile time constant parameter that indicates whether this mutex should ...
Definition: Mutex.h:92
static sys::Mutex Lock
bool parse(MemoryBuffer &Buffer, StringRef BackendName)
bool emit(StringRef FilePrefix, StringRef BackendName) const
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:133
void setCovered(uint64_t RuleID)
static const std::string CoveragePrefix
This interface provides simple read-only access to a block of memory, and provides simple methods for...
Definition: MemoryBuffer.h:42
A range adaptor for a pair of iterators.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool equals(StringRef RHS) const
equals - Check for string equality, this is more efficient than compare() when the relative ordering ...
Definition: StringRef.h:169
const char * getBufferEnd() const
Definition: MemoryBuffer.h:61
static sys::SmartMutex< true > OutputMutex
iterator_range< const_covered_iterator > covered() const
#define I(x, y, z)
Definition: MD5.cpp:58
bool isCovered(uint64_t RuleID) const
size_type size() const
size - Returns the number of bits in this bitvector.
Definition: BitVector.h:170
const char * getBufferStart() const
Definition: MemoryBuffer.h:60
const std::string to_string(const T &Value)
Definition: ScopedPrinter.h:62
iterator_range< const_set_bits_iterator > set_bits() const
Definition: BitVector.h:130
uint64_t read64(const void *P, endianness E)
Definition: Endian.h:354
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49