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