LLVM  6.0.0svn
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"
19 #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  /// Whether we should abort immediately instead of resetting the function.
34  bool AbortOnFailedISel;
35 
36  public:
37  static char ID; // Pass identification, replacement for typeid
38  ResetMachineFunction(bool EmitFallbackDiag = false,
39  bool AbortOnFailedISel = false)
40  : MachineFunctionPass(ID), EmitFallbackDiag(EmitFallbackDiag),
41  AbortOnFailedISel(AbortOnFailedISel) {}
42 
43  StringRef getPassName() const override { return "ResetMachineFunction"; }
44 
45  bool runOnMachineFunction(MachineFunction &MF) override {
46  if (MF.getProperties().hasProperty(
48  if (AbortOnFailedISel)
49  report_fatal_error("Instruction selection failed");
50  DEBUG(dbgs() << "Reseting: " << MF.getName() << '\n');
51  ++NumFunctionsReset;
52  MF.reset();
53  if (EmitFallbackDiag) {
54  const Function &F = *MF.getFunction();
55  DiagnosticInfoISelFallback DiagFallback(F);
56  F.getContext().diagnose(DiagFallback);
57  }
58  return true;
59  }
60  return false;
61  }
62 
63  };
64 } // end anonymous namespace
65 
67 INITIALIZE_PASS(ResetMachineFunction, DEBUG_TYPE,
68  "reset machine function if ISel failed", false, false)
69 
71 llvm::createResetMachineFunctionPass(bool EmitFallbackDiag = false,
72  bool AbortOnFailedISel = false) {
73  return new ResetMachineFunction(EmitFallbackDiag, AbortOnFailedISel);
74 }
Diagnostic information for ISel fallback path.
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:103
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
const MachineFunctionProperties & getProperties() const
Get the function properties.
STATISTIC(NumFunctions, "Total number of functions")
#define DEBUG_TYPE
F(f)
MachineFunctionPass * createResetMachineFunctionPass(bool EmitFallbackDiag, bool AbortOnFailedISel)
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...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function. ...
Definition: Function.cpp:194
INITIALIZE_PASS(ResetMachineFunction, DEBUG_TYPE, "reset machine function if ISel failed", false, false) MachineFunctionPass *llvm
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.
const Function * getFunction() const
getFunction - Return the LLVM function that this machine code represents
bool hasProperty(Property P) const
#define DEBUG(X)
Definition: Debug.h:118
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49