Coverage Report

Created: 2023-09-30 09:22

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h
Line
Count
Source (jump to first uncovered line)
1
//===-- ClangExpressionDeclMap.h --------------------------------*- 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
#ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXPRESSIONDECLMAP_H
10
#define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXPRESSIONDECLMAP_H
11
12
#include <csignal>
13
#include <cstdint>
14
15
#include <memory>
16
#include <vector>
17
18
#include "ClangASTSource.h"
19
#include "ClangExpressionVariable.h"
20
21
#include "lldb/Core/Value.h"
22
#include "lldb/Expression/Materializer.h"
23
#include "lldb/Symbol/SymbolContext.h"
24
#include "lldb/Symbol/TaggedASTType.h"
25
#include "lldb/Target/ExecutionContext.h"
26
#include "lldb/lldb-public.h"
27
#include "clang/AST/Decl.h"
28
#include "llvm/ADT/DenseMap.h"
29
30
namespace lldb_private {
31
32
class ClangPersistentVariables;
33
34
/// \class ClangExpressionDeclMap ClangExpressionDeclMap.h
35
/// "lldb/Expression/ClangExpressionDeclMap.h" Manages named entities that are
36
/// defined in LLDB's debug information.
37
///
38
/// The Clang parser uses the ClangASTSource as an interface to request named
39
/// entities from outside an expression.  The ClangASTSource reports back,
40
/// listing all possible objects corresponding to a particular name.  But it
41
/// in turn relies on ClangExpressionDeclMap, which performs several important
42
/// functions.
43
///
44
/// First, it records what variables and functions were looked up and what
45
/// Decls were returned for them.
46
///
47
/// Second, it constructs a struct on behalf of IRForTarget, recording which
48
/// variables should be placed where and relaying this information back so
49
/// that IRForTarget can generate context-independent code.
50
///
51
/// Third, it "materializes" this struct on behalf of the expression command,
52
/// finding the current values of each variable and placing them into the
53
/// struct so that it can be passed to the JITted version of the IR.
54
///
55
/// Fourth and finally, it "dematerializes" the struct after the JITted code
56
/// has executed, placing the new values back where it found the old ones.
57
class ClangExpressionDeclMap : public ClangASTSource {
58
public:
59
  /// Constructor
60
  ///
61
  /// Initializes class variables.
62
  ///
63
  /// \param[in] keep_result_in_memory
64
  ///     If true, inhibits the normal deallocation of the memory for
65
  ///     the result persistent variable, and instead marks the variable
66
  ///     as persisting.
67
  ///
68
  /// \param[in] result_delegate
69
  ///     If non-NULL, use this delegate to report result values.  This
70
  ///     allows the client ClangUserExpression to report a result.
71
  ///
72
  /// \param[in] target
73
  ///     The target to use when parsing.
74
  ///
75
  /// \param[in] importer
76
  ///     The ClangASTImporter to use when parsing.
77
  ///
78
  /// \param[in] ctx_obj
79
  ///     If not empty, then expression is evaluated in context of this object.
80
  ///     See the comment to `UserExpression::Evaluate` for details.
81
  ClangExpressionDeclMap(
82
      bool keep_result_in_memory,
83
      Materializer::PersistentVariableDelegate *result_delegate,
84
      const lldb::TargetSP &target,
85
      const std::shared_ptr<ClangASTImporter> &importer, ValueObject *ctx_obj);
86
87
  /// Destructor
88
  ~ClangExpressionDeclMap() override;
89
90
  /// Enable the state needed for parsing and IR transformation.
91
  ///
92
  /// \param[in] exe_ctx
93
  ///     The execution context to use when finding types for variables.
94
  ///     Also used to find a "scratch" AST context to store result types.
95
  ///
96
  /// \param[in] materializer
97
  ///     If non-NULL, the materializer to populate with information about
98
  ///     the variables to use
99
  ///
100
  /// \return
101
  ///     True if parsing is possible; false if it is unsafe to continue.
102
  bool WillParse(ExecutionContext &exe_ctx, Materializer *materializer);
103
104
  void InstallCodeGenerator(clang::ASTConsumer *code_gen);
105
106
  void InstallDiagnosticManager(DiagnosticManager &diag_manager);
107
108
  /// Disable the state needed for parsing and IR transformation.
109
  void DidParse();
110
111
  /// [Used by IRForTarget] Add a variable to the list of persistent
112
  ///     variables for the process.
113
  ///
114
  /// \param[in] decl
115
  ///     The Clang declaration for the persistent variable, used for
116
  ///     lookup during parsing.
117
  ///
118
  /// \param[in] name
119
  ///     The name of the persistent variable, usually $something.
120
  ///
121
  /// \param[in] type
122
  ///     The type of the variable, in the Clang parser's context.
123
  ///
124
  /// \return
125
  ///     True on success; false otherwise.
126
  bool AddPersistentVariable(const clang::NamedDecl *decl,
127
                             ConstString name, TypeFromParser type,
128
                             bool is_result, bool is_lvalue);
129
130
  /// [Used by IRForTarget] Add a variable to the struct that needs to
131
  ///     be materialized each time the expression runs.
132
  ///
133
  /// \param[in] decl
134
  ///     The Clang declaration for the variable.
135
  ///
136
  /// \param[in] name
137
  ///     The name of the variable.
138
  ///
139
  /// \param[in] value
140
  ///     The LLVM IR value for this variable.
141
  ///
142
  /// \param[in] size
143
  ///     The size of the variable in bytes.
144
  ///
145
  /// \param[in] alignment
146
  ///     The required alignment of the variable in bytes.
147
  ///
148
  /// \return
149
  ///     True on success; false otherwise.
150
  bool AddValueToStruct(const clang::NamedDecl *decl, ConstString name,
151
                        llvm::Value *value, size_t size,
152
                        lldb::offset_t alignment);
153
154
  /// [Used by IRForTarget] Finalize the struct, laying out the position of
155
  /// each object in it.
156
  ///
157
  /// \return
158
  ///     True on success; false otherwise.
159
  bool DoStructLayout();
160
161
  /// [Used by IRForTarget] Get general information about the laid-out struct
162
  /// after DoStructLayout() has been called.
163
  ///
164
  /// \param[out] num_elements
165
  ///     The number of elements in the struct.
166
  ///
167
  /// \param[out] size
168
  ///     The size of the struct, in bytes.
169
  ///
170
  /// \param[out] alignment
171
  ///     The alignment of the struct, in bytes.
172
  ///
173
  /// \return
174
  ///     True if the information could be retrieved; false otherwise.
175
  bool GetStructInfo(uint32_t &num_elements, size_t &size,
176
                     lldb::offset_t &alignment);
177
178
  /// [Used by IRForTarget] Get specific information about one field of the
179
  /// laid-out struct after DoStructLayout() has been called.
180
  ///
181
  /// \param[out] decl
182
  ///     The parsed Decl for the field, as generated by ClangASTSource
183
  ///     on ClangExpressionDeclMap's behalf.  In the case of the result
184
  ///     value, this will have the name $__lldb_result even if the
185
  ///     result value ends up having the name $1.  This is an
186
  ///     implementation detail of IRForTarget.
187
  ///
188
  /// \param[out] value
189
  ///     The IR value for the field (usually a GlobalVariable).  In
190
  ///     the case of the result value, this will have the correct
191
  ///     name ($1, for instance).  This is an implementation detail
192
  ///     of IRForTarget.
193
  ///
194
  /// \param[out] offset
195
  ///     The offset of the field from the beginning of the struct.
196
  ///     As long as the struct is aligned according to its required
197
  ///     alignment, this offset will align the field correctly.
198
  ///
199
  /// \param[out] name
200
  ///     The name of the field as used in materialization.
201
  ///
202
  /// \param[in] index
203
  ///     The index of the field about which information is requested.
204
  ///
205
  /// \return
206
  ///     True if the information could be retrieved; false otherwise.
207
  bool GetStructElement(const clang::NamedDecl *&decl, llvm::Value *&value,
208
                        lldb::offset_t &offset, ConstString &name,
209
                        uint32_t index);
210
211
  /// [Used by IRForTarget] Get information about a function given its Decl.
212
  ///
213
  /// \param[in] decl
214
  ///     The parsed Decl for the Function, as generated by ClangASTSource
215
  ///     on ClangExpressionDeclMap's behalf.
216
  ///
217
  /// \param[out] ptr
218
  ///     The absolute address of the function in the target.
219
  ///
220
  /// \return
221
  ///     True if the information could be retrieved; false otherwise.
222
  bool GetFunctionInfo(const clang::NamedDecl *decl, uint64_t &ptr);
223
224
  /// [Used by IRForTarget] Get the address of a symbol given nothing but its
225
  /// name.
226
  ///
227
  /// \param[in] target
228
  ///     The target to find the symbol in.  If not provided,
229
  ///     then the current parsing context's Target.
230
  ///
231
  /// \param[in] process
232
  ///     The process to use.  For Objective-C symbols, the process's
233
  ///     Objective-C language runtime may be queried if the process
234
  ///     is non-NULL.
235
  ///
236
  /// \param[in] name
237
  ///     The name of the symbol.
238
  ///
239
  /// \param[in] module
240
  ///     The module to limit the search to. This can be NULL
241
  ///
242
  /// \return
243
  ///     Valid load address for the symbol
244
  lldb::addr_t GetSymbolAddress(Target &target, Process *process,
245
                                ConstString name, lldb::SymbolType symbol_type,
246
                                Module *module = nullptr);
247
248
  lldb::addr_t GetSymbolAddress(ConstString name,
249
                                lldb::SymbolType symbol_type);
250
251
  struct TargetInfo {
252
    lldb::ByteOrder byte_order = lldb::eByteOrderInvalid;
253
    size_t address_byte_size = 0;
254
255
19.8k
    TargetInfo() = default;
256
257
24
    bool IsValid() {
258
24
      return (byte_order != lldb::eByteOrderInvalid && address_byte_size != 0);
259
24
    }
260
  };
261
  TargetInfo GetTargetInfo();
262
263
  /// [Used by ClangASTSource] Find all entities matching a given name, using
264
  /// a NameSearchContext to make Decls for them.
265
  ///
266
  /// \param[in] context
267
  ///     The NameSearchContext that can construct Decls for this name.
268
  void FindExternalVisibleDecls(NameSearchContext &context) override;
269
270
  /// Find all entities matching a given name in a given module/namespace,
271
  /// using a NameSearchContext to make Decls for them.
272
  ///
273
  /// \param[in] context
274
  ///     The NameSearchContext that can construct Decls for this name.
275
  ///
276
  /// \param[in] module
277
  ///     If non-NULL, the module to query.
278
  ///
279
  /// \param[in] namespace_decl
280
  ///     If valid and module is non-NULL, the parent namespace.
281
  void FindExternalVisibleDecls(NameSearchContext &context,
282
                                lldb::ModuleSP module,
283
                                const CompilerDeclContext &namespace_decl);
284
285
protected:
286
  /// Retrieves the declaration with the given name from the storage of
287
  /// persistent declarations.
288
  ///
289
  /// \return
290
  ///     A persistent decl with the given name or a nullptr.
291
  virtual clang::NamedDecl *GetPersistentDecl(ConstString name);
292
293
private:
294
  ExpressionVariableList
295
      m_found_entities; ///< All entities that were looked up for the parser.
296
  ExpressionVariableList
297
      m_struct_members; ///< All entities that need to be placed in the struct.
298
  bool m_keep_result_in_memory; ///< True if result persistent variables
299
                                ///generated by this expression should stay in
300
                                ///memory.
301
  Materializer::PersistentVariableDelegate
302
      *m_result_delegate; ///< If non-NULL, used to report expression results to
303
                          ///ClangUserExpression.
304
  ValueObject *m_ctx_obj; ///< If not empty, then expression is
305
                          ///evaluated in context of this object.
306
                          ///For details see the comment to
307
                          ///`UserExpression::Evaluate`.
308
309
  /// The following values should not live beyond parsing
310
  class ParserVars {
311
  public:
312
9.94k
    ParserVars() = default;
313
314
0
    Target *GetTarget() {
315
0
      if (m_exe_ctx.GetTargetPtr())
316
0
        return m_exe_ctx.GetTargetPtr();
317
0
      else if (m_sym_ctx.target_sp)
318
0
        return m_sym_ctx.target_sp.get();
319
0
      return nullptr;
320
0
    }
321
322
    ExecutionContext m_exe_ctx; ///< The execution context to use when parsing.
323
    SymbolContext m_sym_ctx; ///< The symbol context to use in finding variables
324
                             ///and types.
325
    ClangPersistentVariables *m_persistent_vars =
326
        nullptr; ///< The persistent variables for the process.
327
    bool m_enable_lookups = false; ///< Set to true during parsing if we have
328
                                   ///found the first "$__lldb" name.
329
    TargetInfo m_target_info;      ///< Basic information about the target.
330
    Materializer *m_materializer = nullptr;   ///< If non-NULL, the materializer
331
                                              ///to use when reporting used
332
                                              ///variables.
333
    clang::ASTConsumer *m_code_gen = nullptr; ///< If non-NULL, a code generator
334
                                              ///that receives new top-level
335
                                              ///functions.
336
    DiagnosticManager *m_diagnostics = nullptr;
337
338
  private:
339
    ParserVars(const ParserVars &) = delete;
340
    const ParserVars &operator=(const ParserVars &) = delete;
341
  };
342
343
  std::unique_ptr<ParserVars> m_parser_vars;
344
345
  /// Activate parser-specific variables
346
9.94k
  void EnableParserVars() {
347
9.94k
    if (!m_parser_vars.get())
348
9.94k
      m_parser_vars = std::make_unique<ParserVars>();
349
9.94k
  }
350
351
  /// Deallocate parser-specific variables
352
9.94k
  void DisableParserVars() { m_parser_vars.reset(); }
353
354
  /// The following values contain layout information for the materialized
355
  /// struct, but are not specific to a single materialization
356
  struct StructVars {
357
9.94k
    StructVars() = default;
358
359
    lldb::offset_t m_struct_alignment =
360
        0;                    ///< The alignment of the struct in bytes.
361
    size_t m_struct_size = 0; ///< The size of the struct in bytes.
362
    bool m_struct_laid_out =
363
        false; ///< True if the struct has been laid out and the
364
               /// layout is valid (that is, no new fields have been
365
               /// added since).
366
    ConstString
367
        m_result_name; ///< The name of the result variable ($1, for example)
368
  };
369
370
  std::unique_ptr<StructVars> m_struct_vars;
371
372
  /// Activate struct variables
373
9.94k
  void EnableStructVars() {
374
9.94k
    if (!m_struct_vars.get())
375
9.94k
      m_struct_vars.reset(new struct StructVars);
376
9.94k
  }
377
378
  /// Deallocate struct variables
379
9.94k
  void DisableStructVars() { m_struct_vars.reset(); }
380
381
13.7k
  lldb::TypeSystemClangSP GetScratchContext(Target &target) {
382
13.7k
    return ScratchTypeSystemClang::GetForTarget(target,
383
13.7k
                                                m_ast_context->getLangOpts());
384
13.7k
  }
385
386
  /// Get this parser's ID for use in extracting parser- and JIT-specific data
387
  /// from persistent variables.
388
416k
  uint64_t GetParserID() { return (uint64_t) this; }
389
390
  /// Should be called on all copied functions.
391
  void MaybeRegisterFunctionBody(clang::FunctionDecl *copied_function_decl);
392
393
  /// Searches the persistent decls of the target for entities with the
394
  /// given name.
395
  ///
396
  /// \param[in] context
397
  ///     The NameSearchContext that can construct Decls for this name.
398
  ///
399
  /// \param[in] name
400
  ///     The name of the entities that need to be found.
401
  void SearchPersistenDecls(NameSearchContext &context, const ConstString name);
402
403
  /// Handles looking up $__lldb_class which requires special treatment.
404
  ///
405
  /// \param[in] context
406
  ///     The NameSearchContext that can construct Decls for this name.
407
  void LookUpLldbClass(NameSearchContext &context);
408
409
  /// Handles looking up $__lldb_objc_class which requires special treatment.
410
  ///
411
  /// \param[in] context
412
  ///     The NameSearchContext that can construct Decls for this name.
413
  void LookUpLldbObjCClass(NameSearchContext &context);
414
415
  /// Handles looking up the synthetic namespace that contains our local
416
  /// variables for the current frame.
417
  ///
418
  /// \param[in] sym_ctx
419
  ///     The current SymbolContext of this frame.
420
  ///
421
  /// \param[in] name_context
422
  ///     The NameSearchContext that can construct Decls for this name.
423
  void LookupLocalVarNamespace(SymbolContext &sym_ctx,
424
                               NameSearchContext &name_context);
425
426
  /// Lookup entities in the ClangModulesDeclVendor.
427
  /// \param[in] context
428
  ///     The NameSearchContext that can construct Decls for this name.
429
  ///
430
  /// \param[in] name
431
  ///     The name of the entities that need to be found.
432
  void LookupInModulesDeclVendor(NameSearchContext &context, ConstString name);
433
434
  /// Looks up a local variable.
435
  ///
436
  /// \param[in] context
437
  ///     The NameSearchContext that can construct Decls for this name.
438
  ///
439
  /// \param[in] name
440
  ///     The name of the entities that need to be found.
441
  ///
442
  /// \param[in] sym_ctx
443
  ///     The current SymbolContext of this frame.
444
  ///
445
  /// \param[in] namespace_decl
446
  ///     The parent namespace if there is one.
447
  ///
448
  /// \return
449
  ///    True iff a local variable was found.
450
  bool LookupLocalVariable(NameSearchContext &context, ConstString name,
451
                           SymbolContext &sym_ctx,
452
                           const CompilerDeclContext &namespace_decl);
453
454
  /// Searches for functions in the given SymbolContextList.
455
  ///
456
  /// \param[in] sc_list
457
  ///     The SymbolContextList to search.
458
  ///
459
  /// \param[in] frame_decl_context
460
  ///     The current DeclContext of the current frame.
461
  ///
462
  /// \return
463
  ///     A SymbolContextList with any found functions in the front and
464
  ///     any unknown SymbolContexts which are not functions in the back.
465
  ///     The SymbolContexts for the functions are ordered by how close they are
466
  ///     to the DeclContext for the given frame DeclContext.
467
  SymbolContextList SearchFunctionsInSymbolContexts(
468
      const SymbolContextList &sc_list,
469
      const CompilerDeclContext &frame_decl_context);
470
471
  /// Looks up a function.
472
  ///
473
  /// \param[in] context
474
  ///     The NameSearchContext that can construct Decls for this name.
475
  ///
476
  /// \param[in] module_sp
477
  ///     If non-NULL, the module to query.
478
  ///
479
  /// \param[in] name
480
  ///     The name of the function that should be find.
481
  ///
482
  /// \param[in] namespace_decl
483
  ///     If valid and module is non-NULL, the parent namespace.
484
  void LookupFunction(NameSearchContext &context, lldb::ModuleSP module_sp,
485
                      ConstString name,
486
                      const CompilerDeclContext &namespace_decl);
487
488
  /// Given a target, find a variable that matches the given name and type.
489
  ///
490
  /// \param[in] target
491
  ///     The target to use as a basis for finding the variable.
492
  ///
493
  /// \param[in] module
494
  ///     If non-NULL, the module to search.
495
  ///
496
  /// \param[in] name
497
  ///     The name as a plain C string.
498
  ///
499
  /// \param[in] namespace_decl
500
  ///     If non-NULL and module is non-NULL, the parent namespace.
501
  ///
502
  /// \return
503
  ///     The LLDB Variable found, or NULL if none was found.
504
  lldb::VariableSP
505
  FindGlobalVariable(Target &target, lldb::ModuleSP &module, ConstString name,
506
                     const CompilerDeclContext &namespace_decl);
507
508
  /// Get the value of a variable in a given execution context and return the
509
  /// associated Types if needed.
510
  ///
511
  /// \param[in] var
512
  ///     The variable to evaluate.
513
  ///
514
  /// \param[out] var_location
515
  ///     The variable location value to fill in
516
  ///
517
  /// \param[out] found_type
518
  ///     The type of the found value, as it was found in the user process.
519
  ///     This is only useful when the variable is being inspected on behalf
520
  ///     of the parser, hence the default.
521
  ///
522
  /// \param[out] parser_type
523
  ///     The type of the found value, as it was copied into the parser's
524
  ///     AST context.  This is only useful when the variable is being
525
  ///     inspected on behalf of the parser, hence the default.
526
  ///
527
  /// \return
528
  ///     Return true if the value was successfully filled in.
529
  bool GetVariableValue(lldb::VariableSP &var,
530
                        lldb_private::Value &var_location,
531
                        TypeFromUser *found_type = nullptr,
532
                        TypeFromParser *parser_type = nullptr);
533
534
  /// Use the NameSearchContext to generate a Decl for the given LLDB
535
  /// ValueObject, and put it in the list of found entities.
536
  ///
537
  /// Helper function used by the other AddOneVariable APIs.
538
  ///
539
  /// \param[in,out] context
540
  ///     The NameSearchContext to use when constructing the Decl.
541
  ///
542
  /// \param[in] pt
543
  ///     The CompilerType of the variable we're adding a Decl for.
544
  ///
545
  /// \param[in] var
546
  ///     The LLDB ValueObject that needs a Decl.
547
  ClangExpressionVariable::ParserVars *
548
  AddExpressionVariable(NameSearchContext &context, TypeFromParser const &pt,
549
                        lldb::ValueObjectSP valobj);
550
551
  /// Use the NameSearchContext to generate a Decl for the given LLDB
552
  /// Variable, and put it in the Tuple list.
553
  ///
554
  /// \param[in] context
555
  ///     The NameSearchContext to use when constructing the Decl.
556
  ///
557
  /// \param[in] var
558
  ///     The LLDB Variable that needs a Decl.
559
  ///
560
  /// \param[in] valobj
561
  ///     The LLDB ValueObject for that variable.
562
  void AddOneVariable(NameSearchContext &context, lldb::VariableSP var,
563
                      lldb::ValueObjectSP valobj);
564
565
  /// Use the NameSearchContext to generate a Decl for the given ValueObject
566
  /// and put it in the list of found entities.
567
  ///
568
  /// \param[in,out] context
569
  ///     The NameSearchContext to use when constructing the Decl.
570
  ///
571
  /// \param[in] valobj
572
  ///     The ValueObject that needs a Decl.
573
  ///
574
  /// \param[in] valobj_provider Callback that fetches a ValueObjectSP
575
  ///            from the specified frame
576
  void AddOneVariable(NameSearchContext &context, lldb::ValueObjectSP valobj,
577
                      ValueObjectProviderTy valobj_provider);
578
579
  /// Use the NameSearchContext to generate a Decl for the given persistent
580
  /// variable, and put it in the list of found entities.
581
  ///
582
  /// \param[in] context
583
  ///     The NameSearchContext to use when constructing the Decl.
584
  ///
585
  /// \param[in] pvar_sp
586
  ///     The persistent variable that needs a Decl.
587
  void AddOneVariable(NameSearchContext &context,
588
                      lldb::ExpressionVariableSP &pvar_sp);
589
590
  /// Use the NameSearchContext to generate a Decl for the given LLDB symbol
591
  /// (treated as a variable), and put it in the list of found entities.
592
  void AddOneGenericVariable(NameSearchContext &context, const Symbol &symbol);
593
594
  /// Use the NameSearchContext to generate a Decl for the given function.
595
  /// (Functions are not placed in the Tuple list.)  Can handle both fully
596
  /// typed functions and generic functions.
597
  ///
598
  /// \param[in] context
599
  ///     The NameSearchContext to use when constructing the Decl.
600
  ///
601
  /// \param[in] fun
602
  ///     The Function that needs to be created.  If non-NULL, this is
603
  ///     a fully-typed function.
604
  ///
605
  /// \param[in] sym
606
  ///     The Symbol that corresponds to a function that needs to be
607
  ///     created with generic type (unitptr_t foo(...)).
608
  void AddOneFunction(NameSearchContext &context, Function *fun, Symbol *sym);
609
610
  /// Use the NameSearchContext to generate a Decl for the given register.
611
  ///
612
  /// \param[in] context
613
  ///     The NameSearchContext to use when constructing the Decl.
614
  ///
615
  /// \param[in] reg_info
616
  ///     The information corresponding to that register.
617
  void AddOneRegister(NameSearchContext &context, const RegisterInfo *reg_info);
618
619
  /// Use the NameSearchContext to generate a Decl for the given type.  (Types
620
  /// are not placed in the Tuple list.)
621
  ///
622
  /// \param[in] context
623
  ///     The NameSearchContext to use when constructing the Decl.
624
  ///
625
  /// \param[in] type
626
  ///     The type that needs to be created.
627
  void AddOneType(NameSearchContext &context, const TypeFromUser &type);
628
629
  /// Adds the class in which the expression is evaluated to the lookup and
630
  /// prepares the class to be used as a context for expression evaluation (for
631
  /// example, it creates a fake member function that will contain the
632
  /// expression LLDB is trying to evaluate).
633
  ///
634
  /// \param[in] context
635
  ///     The NameSearchContext to which the class should be added as a lookup
636
  ///     result.
637
  ///
638
  /// \param[in] type
639
  ///     The type of the class that serves as the evaluation context.
640
  void AddContextClassType(NameSearchContext &context,
641
                           const TypeFromUser &type);
642
643
  /// Move a type out of the current ASTContext into another, but make sure to
644
  /// export all components of the type also.
645
  ///
646
  /// \param[in] target
647
  ///     The TypeSystemClang to move to.
648
  /// \param[in] source
649
  ///     The TypeSystemClang to move from.  This is assumed to be going away.
650
  /// \param[in] parser_type
651
  ///     The type as it appears in the source context.
652
  ///
653
  /// \return
654
  ///     Returns the moved type, or an empty type if there was a problem.
655
  TypeFromUser DeportType(TypeSystemClang &target, TypeSystemClang &source,
656
                          TypeFromParser parser_type);
657
658
  TypeSystemClang *GetTypeSystemClang();
659
};
660
661
} // namespace lldb_private
662
663
#endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_CLANGEXPRESSIONDECLMAP_H