LLVM  4.0.0
ResetMachineFunctionPass.cpp
Go to the documentation of this file.
1 //===-- ResetMachineFunctionPass.cpp - Reset Machine Function ----*- C++ -*-==//
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 a pass that will conditionally reset a machine
11 /// function as if it was just created. This is used to provide a fallback
12 /// mechanism when GlobalISel fails, thus the condition for the reset to
13 /// happen is that the MachineFunction has the FailedISel property.
14 //===----------------------------------------------------------------------===//
15 
16 #include "llvm/ADT/Statistic.h"
17 #include "llvm/CodeGen/Passes.h"
20 #include "llvm/IR/DiagnosticInfo.h"
21 #include "llvm/Support/Debug.h"
22 using namespace llvm;
23 
24 #define DEBUG_TYPE "reset-machine-function"
25 
26 STATISTIC(NumFunctionsReset, "Number of functions reset");
27 
28 namespace {
29  class ResetMachineFunction : public MachineFunctionPass {
30  /// Tells whether or not this pass should emit a fallback
31  /// diagnostic when it resets a function.
32  bool EmitFallbackDiag;
33 
34  public:
35  static char ID; // Pass identification, replacement for typeid
36  ResetMachineFunction(bool EmitFallbackDiag = false)
37  : MachineFunctionPass(ID), EmitFallbackDiag(EmitFallbackDiag) {}
38 
39  StringRef getPassName() const override { return "ResetMachineFunction"; }
40 
41  bool runOnMachineFunction(MachineFunction &MF) override {
42  if (MF.getProperties().hasProperty(
44  DEBUG(dbgs() << "Reseting: " << MF.getName() << '\n');
45  ++NumFunctionsReset;
46  MF.reset();
47  if (EmitFallbackDiag) {
48  const Function &F = *MF.getFunction();
49  DiagnosticInfoISelFallback DiagFallback(F);
50  F.getContext().diagnose(DiagFallback);
51  }
52  return true;
53  }
54  return false;
55  }
56 
57  };
58 } // end anonymous namespace
59 
61 INITIALIZE_PASS(ResetMachineFunction, DEBUG_TYPE,
62  "reset machine function if ISel failed", false, false)
63 
65 llvm::createResetMachineFunctionPass(bool EmitFallbackDiag = false) {
66  return new ResetMachineFunction(EmitFallbackDiag);
67 }
Diagnostic information for ISel fallback path.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function. ...
Definition: Function.cpp:226
STATISTIC(NumFunctions,"Total number of functions")
bool hasProperty(Property P) const
INITIALIZE_PASS(ResetMachineFunction, DEBUG_TYPE,"reset machine function if ISel failed", false, false) MachineFunctionPass *llvm
#define DEBUG_TYPE
const Function * getFunction() const
getFunction - Return the LLVM function that this machine code represents
MachineFunctionPass * createResetMachineFunctionPass(bool EmitFallbackDiag)
This pass resets a MachineFunction when it has the FailedISel property as if it was just created...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const MachineFunctionProperties & getProperties() const
Get the function properties.
#define F(x, y, z)
Definition: MD5.cpp:51
Function Alias Analysis false
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:132
void reset()
Reset the instance as if it was just created.
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
#define DEBUG(X)
Definition: Debug.h:100
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:47
StringRef getName() const
getName - Return the name of the corresponding LLVM function.