IRToDWARF.h revision b344843f75ef893762c93fd0a22d2d45712ce74d
1//===-- IRToDWARF.h ---------------------------------------------*- 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
10#ifndef liblldb_IRToDWARF_h_
11#define liblldb_IRToDWARF_h_
12
13#include "llvm/Pass.h"
14#include "llvm/PassManager.h"
15
16#include "lldb/lldb-public.h"
17
18class Relocator;
19//----------------------------------------------------------------------
20/// @class IRToDWARF IRToDWARF.h "lldb/Expression/IRToDWARF.h"
21/// @brief Transforms the IR for a function into a DWARF location expression
22///
23/// Once an expression has been parsed and converted to IR, it can run
24/// in two contexts: interpreted by LLDB as a DWARF location expression,
25/// or compiled by the JIT and inserted into the target process for
26/// execution.
27///
28/// IRToDWARF makes the first possible, by traversing the control flow
29/// graph and writing the code for each basic block out as location
30/// expression bytecode.  To ensure that the links between the basic blocks
31/// remain intact, it uses a relocator that records the location of every
32/// location expression instruction that has a relocatable operand, the
33/// target of that operand (as a basic block), and the mapping of each basic
34/// block to an actual location.  After all code has been written out, the
35/// relocator post-processes it and performs all necessary relocations.
36//----------------------------------------------------------------------
37class IRToDWARF : public llvm::ModulePass
38{
39public:
40    //------------------------------------------------------------------
41    /// Constructor
42    ///
43    /// @param[in] local_vars
44    ///     A list of variables to populate with the local variables this
45    ///     expression uses.
46    ///
47    /// @param[in] decl_map
48    ///     The list of externally-referenced variables for the expression,
49    ///     for use in looking up globals.
50    ///
51    /// @param[in] stream
52    ///     The stream to dump DWARF bytecode onto.
53    ///
54    /// @param[in] func_name
55    ///     The name of the function to translate to DWARF.
56    //------------------------------------------------------------------
57    IRToDWARF(lldb_private::ClangExpressionVariableList &local_vars,
58              lldb_private::ClangExpressionDeclMap *decl_map,
59              lldb_private::StreamString &strm,
60              const char* func_name = "$__lldb_expr");
61
62    //------------------------------------------------------------------
63    /// Destructor
64    //------------------------------------------------------------------
65    virtual ~IRToDWARF();
66
67    //------------------------------------------------------------------
68    /// Run this IR transformer on a single module
69    ///
70    /// @param[in] M
71    ///     The module to run on.  This module is searched for the function
72    ///     $__lldb_expr, and that function is converted to a location
73    ///     expression.
74    ///
75    /// @return
76    ///     True on success; false otherwise
77    //------------------------------------------------------------------
78    bool runOnModule(llvm::Module &M);
79
80    //------------------------------------------------------------------
81    /// Interface stub
82    //------------------------------------------------------------------
83    void assignPassManager(llvm::PMStack &PMS,
84                           llvm::PassManagerType T = llvm::PMT_ModulePassManager);
85
86    //------------------------------------------------------------------
87    /// Returns PMT_ModulePassManager
88    //------------------------------------------------------------------
89    llvm::PassManagerType getPotentialPassManagerType() const;
90private:
91    //------------------------------------------------------------------
92    /// Run this IR transformer on a single basic block
93    ///
94    /// @param[in] BB
95    ///     The basic block to transform.
96    ///
97    /// @param[in] Relocator
98    ///     The relocator to use when registering branches.
99    ///
100    /// @return
101    ///     True on success; false otherwise
102    //------------------------------------------------------------------
103    bool runOnBasicBlock(llvm::BasicBlock &BB, Relocator &Relocator);
104
105    std::string m_func_name;                                    ///< The name of the function to translate
106    lldb_private::ClangExpressionVariableList &m_local_vars;   ///< The list of local variables to populate while transforming
107    lldb_private::ClangExpressionDeclMap *m_decl_map;           ///< The list of external variables
108    lldb_private::StreamString &m_strm;                         ///< The stream to write bytecode to
109};
110
111#endif
112