1 //===-- Function.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_Function_h_ 11 #define liblldb_Function_h_ 12 13 #include "lldb/Core/ClangForward.h" 14 #include "lldb/Core/AddressRange.h" 15 #include "lldb/Symbol/Block.h" 16 #include "lldb/Symbol/Declaration.h" 17 #include "lldb/Expression/DWARFExpression.h" 18 #include "lldb/Core/Mangled.h" 19 #include "lldb/Core/UserID.h" 20 21 namespace lldb_private { 22 23 //---------------------------------------------------------------------- 24 /// @class FunctionInfo Function.h "lldb/Symbol/Function.h" 25 /// @brief A class that contains generic function information. 26 /// 27 /// This provides generic function information that gets resused between 28 /// inline functions and function types. 29 //---------------------------------------------------------------------- 30 class FunctionInfo 31 { 32 public: 33 //------------------------------------------------------------------ 34 /// Construct with the function method name and optional declaration 35 /// information. 36 /// 37 /// @param[in] name 38 /// A C string name for the method name for this function. This 39 /// value should not be the mangled named, but the simple method 40 /// name. 41 /// 42 /// @param[in] decl_ptr 43 /// Optional declaration information that describes where the 44 /// function was declared. This can be NULL. 45 //------------------------------------------------------------------ 46 FunctionInfo (const char *name, const Declaration *decl_ptr); 47 48 //------------------------------------------------------------------ 49 /// Construct with the function method name and optional declaration 50 /// information. 51 /// 52 /// @param[in] name 53 /// A name for the method name for this function. This value 54 /// should not be the mangled named, but the simple method name. 55 /// 56 /// @param[in] decl_ptr 57 /// Optional declaration information that describes where the 58 /// function was declared. This can be NULL. 59 //------------------------------------------------------------------ 60 FunctionInfo (const ConstString& name, const Declaration *decl_ptr); 61 62 //------------------------------------------------------------------ 63 /// Destructor. 64 /// 65 /// The destructor is virtual since classes inherit from this class. 66 //------------------------------------------------------------------ 67 virtual 68 ~FunctionInfo (); 69 70 //------------------------------------------------------------------ 71 /// Compare two function information objects. 72 /// 73 /// First compares the method names, and if equal, then compares 74 /// the declaration information. 75 /// 76 /// @param[in] lhs 77 /// The Left Hand Side const FunctionInfo object reference. 78 /// 79 /// @param[in] rhs 80 /// The Right Hand Side const FunctionInfo object reference. 81 /// 82 /// @return 83 /// @li -1 if lhs < rhs 84 /// @li 0 if lhs == rhs 85 /// @li 1 if lhs > rhs 86 //------------------------------------------------------------------ 87 static int 88 Compare (const FunctionInfo& lhs, const FunctionInfo& rhs); 89 90 //------------------------------------------------------------------ 91 /// Dump a description of this object to a Stream. 92 /// 93 /// Dump a description of the contents of this object to the 94 /// supplied stream \a s. 95 /// 96 /// @param[in] s 97 /// The stream to which to dump the object descripton. 98 //------------------------------------------------------------------ 99 void 100 Dump (Stream *s, bool show_fullpaths) const; 101 102 //------------------------------------------------------------------ 103 /// Get accessor for the declaration information. 104 /// 105 /// @return 106 /// A reference to the declaration object. 107 //------------------------------------------------------------------ 108 Declaration& 109 GetDeclaration (); 110 111 //------------------------------------------------------------------ 112 /// Get const accessor for the declaration information. 113 /// 114 /// @return 115 /// A const reference to the declaration object. 116 //------------------------------------------------------------------ 117 const Declaration& 118 GetDeclaration () const; 119 120 //------------------------------------------------------------------ 121 /// Get accessor for the method name. 122 /// 123 /// @return 124 /// A const reference to the method name object. 125 //------------------------------------------------------------------ 126 const ConstString& 127 GetName () const; 128 129 //------------------------------------------------------------------ 130 /// Get the memory cost of this object. 131 /// 132 /// @return 133 /// The number of bytes that this object occupies in memory. 134 /// The returned value does not include the bytes for any 135 /// shared string values. 136 /// 137 /// @see ConstString::StaticMemorySize () 138 //------------------------------------------------------------------ 139 virtual size_t 140 MemorySize () const; 141 142 protected: 143 //------------------------------------------------------------------ 144 // Member variables. 145 //------------------------------------------------------------------ 146 ConstString m_name; ///< Function method name (not a mangled name). 147 Declaration m_declaration; ///< Information describing where this function information was defined. 148 }; 149 150 151 //---------------------------------------------------------------------- 152 /// @class InlineFunctionInfo Function.h "lldb/Symbol/Function.h" 153 /// @brief A class that describes information for an inlined function. 154 //---------------------------------------------------------------------- 155 class InlineFunctionInfo : public FunctionInfo 156 { 157 public: 158 //------------------------------------------------------------------ 159 /// Construct with the function method name, mangled name, and 160 /// optional declaration information. 161 /// 162 /// @param[in] name 163 /// A C string name for the method name for this function. This 164 /// value should not be the mangled named, but the simple method 165 /// name. 166 /// 167 /// @param[in] mangled 168 /// A C string name for the mangled name for this function. This 169 /// value can be NULL if there is no mangled information. 170 /// 171 /// @param[in] decl_ptr 172 /// Optional declaration information that describes where the 173 /// function was declared. This can be NULL. 174 /// 175 /// @param[in] call_decl_ptr 176 /// Optional calling location declaration information that 177 /// describes from where this inlined function was called. 178 //------------------------------------------------------------------ 179 InlineFunctionInfo(const char *name, const char *mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr); 180 181 //------------------------------------------------------------------ 182 /// Construct with the function method name, mangled name, and 183 /// optional declaration information. 184 /// 185 /// @param[in] name 186 /// A name for the method name for this function. This value 187 /// should not be the mangled named, but the simple method name. 188 /// 189 /// @param[in] mangled 190 /// A name for the mangled name for this function. This value 191 /// can be empty if there is no mangled information. 192 /// 193 /// @param[in] decl_ptr 194 /// Optional declaration information that describes where the 195 /// function was declared. This can be NULL. 196 /// 197 /// @param[in] call_decl_ptr 198 /// Optional calling location declaration information that 199 /// describes from where this inlined function was called. 200 //------------------------------------------------------------------ 201 InlineFunctionInfo(const ConstString& name, const Mangled &mangled, const Declaration *decl_ptr, const Declaration *call_decl_ptr); 202 203 //------------------------------------------------------------------ 204 /// Destructor. 205 //------------------------------------------------------------------ 206 ~InlineFunctionInfo(); 207 208 //------------------------------------------------------------------ 209 /// Compare two inlined function information objects. 210 /// 211 /// First compares the FunctionInfo objects, and if equal, 212 /// compares the mangled names. 213 /// 214 /// @param[in] lhs 215 /// The Left Hand Side const InlineFunctionInfo object 216 /// reference. 217 /// 218 /// @param[in] rhs 219 /// The Right Hand Side const InlineFunctionInfo object 220 /// reference. 221 /// 222 /// @return 223 /// @li -1 if lhs < rhs 224 /// @li 0 if lhs == rhs 225 /// @li 1 if lhs > rhs 226 //------------------------------------------------------------------ 227 int 228 Compare(const InlineFunctionInfo& lhs, const InlineFunctionInfo& rhs); 229 230 //------------------------------------------------------------------ 231 /// Dump a description of this object to a Stream. 232 /// 233 /// Dump a description of the contents of this object to the 234 /// supplied stream \a s. 235 /// 236 /// @param[in] s 237 /// The stream to which to dump the object descripton. 238 //------------------------------------------------------------------ 239 void 240 Dump(Stream *s, bool show_fullpaths) const; 241 242 void 243 DumpStopContext (Stream *s) const; 244 245 const ConstString & 246 GetName () const; 247 248 //------------------------------------------------------------------ 249 /// Get accessor for the call site declaration information. 250 /// 251 /// @return 252 /// A reference to the declaration object. 253 //------------------------------------------------------------------ 254 Declaration& 255 GetCallSite (); 256 257 //------------------------------------------------------------------ 258 /// Get const accessor for the call site declaration information. 259 /// 260 /// @return 261 /// A const reference to the declaration object. 262 //------------------------------------------------------------------ 263 const Declaration& 264 GetCallSite () const; 265 266 //------------------------------------------------------------------ 267 /// Get accessor for the mangled name object. 268 /// 269 /// @return 270 /// A reference to the mangled name object. 271 //------------------------------------------------------------------ 272 Mangled& 273 GetMangled(); 274 275 //------------------------------------------------------------------ 276 /// Get const accessor for the mangled name object. 277 /// 278 /// @return 279 /// A const reference to the mangled name object. 280 //------------------------------------------------------------------ 281 const Mangled& 282 GetMangled() const; 283 284 //------------------------------------------------------------------ 285 /// Get the memory cost of this object. 286 /// 287 /// @return 288 /// The number of bytes that this object occupies in memory. 289 /// The returned value does not include the bytes for any 290 /// shared string values. 291 /// 292 /// @see ConstString::StaticMemorySize () 293 //------------------------------------------------------------------ 294 virtual size_t 295 MemorySize() const; 296 297 private: 298 //------------------------------------------------------------------ 299 // Member variables. 300 //------------------------------------------------------------------ 301 Mangled m_mangled; ///< Mangled inlined function name (can be empty if there is no mangled information). 302 Declaration m_call_decl; 303 }; 304 305 //---------------------------------------------------------------------- 306 /// @class Function Function.h "lldb/Symbol/Function.h" 307 /// @brief A class that describes a function. 308 /// 309 /// Functions belong to CompileUnit objects (Function::m_comp_unit), 310 /// have unique user IDs (Function::UserID), know how to reconstruct 311 /// their symbol context (Function::SymbolContextScope), have a 312 /// specific function type (Function::m_type_uid), have a simple 313 /// method name (FunctionInfo::m_name), be declared at a specific 314 /// location (FunctionInfo::m_declaration), possibly have mangled 315 /// names (Function::m_mangled), an optional return type 316 /// (Function::m_type), and contains lexical blocks 317 /// (Function::m_blocks). 318 /// 319 /// The function inforation is split into a few pieces: 320 /// @li The concrete instance information 321 /// @li The abstract information 322 /// 323 /// The abstract information is found in the function type (Type) that 324 /// describes a function information, return type and parameter types. 325 /// 326 /// The concreate information is the address range information and 327 /// specific locations for an instance of this function. 328 //---------------------------------------------------------------------- 329 class Function : 330 public UserID, 331 public SymbolContextScope 332 { 333 public: 334 //------------------------------------------------------------------ 335 /// Construct with a compile unit, function UID, function type UID, 336 /// optional mangled name, function type, and a section offset 337 /// based address range. 338 /// 339 /// @param[in] comp_unit 340 /// The compile unit to which this function belongs. 341 /// 342 /// @param[in] func_uid 343 /// The UID for this function. This value is provided by the 344 /// SymbolFile plug-in and can be any value that allows 345 /// the plug-in to quickly find and parse more detailed 346 /// information when and if more information is needed. 347 /// 348 /// @param[in] func_type_uid 349 /// The type UID for the function Type to allow for lazy type 350 /// parsing from the debug information. 351 /// 352 /// @param[in] mangled 353 /// The optional mangled name for this function. If empty, there 354 /// is no mangled information. 355 /// 356 /// @param[in] func_type 357 /// The optional function type. If NULL, the function type will 358 /// be parsed on demand when accessed using the 359 /// Function::GetType() function by asking the SymbolFile 360 /// plug-in to get the type for \a func_type_uid. 361 /// 362 /// @param[in] range 363 /// The section offset based address for this function. 364 //------------------------------------------------------------------ 365 Function ( 366 CompileUnit *comp_unit, 367 lldb::user_id_t func_uid, 368 lldb::user_id_t func_type_uid, 369 const Mangled &mangled, 370 Type * func_type, 371 const AddressRange& range); 372 373 //------------------------------------------------------------------ 374 /// Construct with a compile unit, function UID, function type UID, 375 /// optional mangled name, function type, and a section offset 376 /// based address range. 377 /// 378 /// @param[in] comp_unit 379 /// The compile unit to which this function belongs. 380 /// 381 /// @param[in] func_uid 382 /// The UID for this function. This value is provided by the 383 /// SymbolFile plug-in and can be any value that allows 384 /// the plug-in to quickly find and parse more detailed 385 /// information when and if more information is needed. 386 /// 387 /// @param[in] func_type_uid 388 /// The type UID for the function Type to allow for lazy type 389 /// parsing from the debug information. 390 /// 391 /// @param[in] mangled 392 /// The optional mangled name for this function. If empty, there 393 /// is no mangled information. 394 /// 395 /// @param[in] func_type 396 /// The optional function type. If NULL, the function type will 397 /// be parsed on demand when accessed using the 398 /// Function::GetType() function by asking the SymbolFile 399 /// plug-in to get the type for \a func_type_uid. 400 /// 401 /// @param[in] range 402 /// The section offset based address for this function. 403 //------------------------------------------------------------------ 404 Function ( 405 CompileUnit *comp_unit, 406 lldb::user_id_t func_uid, 407 lldb::user_id_t func_type_uid, 408 const char *mangled, 409 Type * func_type, 410 const AddressRange& range); 411 412 //------------------------------------------------------------------ 413 /// Destructor. 414 //------------------------------------------------------------------ 415 ~Function (); 416 417 //------------------------------------------------------------------ 418 /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*) 419 /// 420 /// @see SymbolContextScope 421 //------------------------------------------------------------------ 422 virtual void 423 CalculateSymbolContext(SymbolContext* sc); 424 425 virtual lldb::ModuleSP 426 CalculateSymbolContextModule (); 427 428 virtual CompileUnit * 429 CalculateSymbolContextCompileUnit (); 430 431 virtual Function * 432 CalculateSymbolContextFunction (); 433 434 const AddressRange & 435 GetAddressRange() 436 { 437 return m_range; 438 } 439 440 //------------------------------------------------------------------ 441 /// Find the file and line number of the source location of the start 442 /// of the function. This will use the declaration if present and fall 443 /// back on the line table if that fails. So there may NOT be a line 444 /// table entry for this source file/line combo. 445 /// 446 /// @param[out] source_file 447 /// The source file. 448 /// 449 /// @param[out] line_no 450 /// The line number. 451 //------------------------------------------------------------------ 452 void 453 GetStartLineSourceInfo (FileSpec &source_file, uint32_t &line_no); 454 455 //------------------------------------------------------------------ 456 /// Find the file and line number of the source location of the end 457 /// of the function. 458 /// 459 /// 460 /// @param[out] source_file 461 /// The source file. 462 /// 463 /// @param[out] line_no 464 /// The line number. 465 //------------------------------------------------------------------ 466 void 467 GetEndLineSourceInfo (FileSpec &source_file, uint32_t &line_no); 468 469 //------------------------------------------------------------------ 470 /// Get accessor for the block list. 471 /// 472 /// @return 473 /// The block list object that describes all lexical blocks 474 /// in the function. 475 /// 476 /// @see BlockList 477 //------------------------------------------------------------------ 478 Block& 479 GetBlock (bool can_create); 480 481 //------------------------------------------------------------------ 482 /// Get accessor for the compile unit that owns this function. 483 /// 484 /// @return 485 /// A compile unit object pointer. 486 //------------------------------------------------------------------ 487 CompileUnit* 488 GetCompileUnit(); 489 490 //------------------------------------------------------------------ 491 /// Get const accessor for the compile unit that owns this function. 492 /// 493 /// @return 494 /// A const compile unit object pointer. 495 //------------------------------------------------------------------ 496 const CompileUnit* 497 GetCompileUnit() const; 498 499 void 500 GetDescription(Stream *s, lldb::DescriptionLevel level, Target *target); 501 502 //------------------------------------------------------------------ 503 /// Get accessor for the frame base location. 504 /// 505 /// @return 506 /// A location expression that describes the function frame 507 /// base. 508 //------------------------------------------------------------------ 509 DWARFExpression & 510 GetFrameBaseExpression() 511 { 512 return m_frame_base; 513 } 514 515 //------------------------------------------------------------------ 516 /// Get const accessor for the frame base location. 517 /// 518 /// @return 519 /// A const compile unit object pointer. 520 //------------------------------------------------------------------ 521 const DWARFExpression & 522 GetFrameBaseExpression() const 523 { 524 return m_frame_base; 525 } 526 527 const ConstString & 528 GetName() const 529 { 530 return m_mangled.GetName(); 531 } 532 533 const Mangled & 534 GetMangled() const 535 { 536 return m_mangled; 537 } 538 539 //------------------------------------------------------------------ 540 /// Get the DeclContext for this function, if available. 541 /// 542 /// @return 543 /// The DeclContext, or NULL if none exists. 544 //------------------------------------------------------------------ 545 clang::DeclContext * 546 GetClangDeclContext(); 547 548 //------------------------------------------------------------------ 549 /// Get accessor for the type that describes the function 550 /// return value type, and paramter types. 551 /// 552 /// @return 553 /// A type object pointer. 554 //------------------------------------------------------------------ 555 Type* 556 GetType(); 557 558 //------------------------------------------------------------------ 559 /// Get const accessor for the type that describes the function 560 /// return value type, and paramter types. 561 /// 562 /// @return 563 /// A const type object pointer. 564 //------------------------------------------------------------------ 565 const Type* 566 GetType() const; 567 568 ClangASTType 569 GetClangType (); 570 571 uint32_t 572 GetPrologueByteSize (); 573 574 //------------------------------------------------------------------ 575 /// Dump a description of this object to a Stream. 576 /// 577 /// Dump a description of the contents of this object to the 578 /// supplied stream \a s. 579 /// 580 /// @param[in] s 581 /// The stream to which to dump the object descripton. 582 /// 583 /// @param[in] show_context 584 /// If \b true, variables will dump their symbol context 585 /// information. 586 //------------------------------------------------------------------ 587 void 588 Dump(Stream *s, bool show_context) const; 589 590 //------------------------------------------------------------------ 591 /// @copydoc SymbolContextScope::DumpSymbolContext(Stream*) 592 /// 593 /// @see SymbolContextScope 594 //------------------------------------------------------------------ 595 virtual void 596 DumpSymbolContext(Stream *s); 597 598 //------------------------------------------------------------------ 599 /// Get the memory cost of this object. 600 /// 601 /// @return 602 /// The number of bytes that this object occupies in memory. 603 /// The returned value does not include the bytes for any 604 /// shared string values. 605 /// 606 /// @see ConstString::StaticMemorySize () 607 //------------------------------------------------------------------ 608 size_t 609 MemorySize () const; 610 611 protected: 612 613 enum 614 { 615 flagsCalculatedPrologueSize = (1 << 0) ///< Have we already tried to calculate the prologue size? 616 }; 617 618 619 620 //------------------------------------------------------------------ 621 // Member variables. 622 //------------------------------------------------------------------ 623 CompileUnit *m_comp_unit; ///< The compile unit that owns this function. 624 lldb::user_id_t m_type_uid; ///< The user ID of for the prototype Type for this function. 625 Type * m_type; ///< The function prototype type for this function that include the function info (FunctionInfo), return type and parameters. 626 Mangled m_mangled; ///< The mangled function name if any, if empty, there is no mangled information. 627 Block m_block; ///< All lexical blocks contained in this function. 628 AddressRange m_range; ///< The function address range that covers the widest range needed to contain all blocks 629 DWARFExpression m_frame_base; ///< The frame base expression for variables that are relative to the frame pointer. 630 Flags m_flags; 631 uint32_t m_prologue_byte_size; ///< Compute the prologue size once and cache it 632 private: 633 DISALLOW_COPY_AND_ASSIGN(Function); 634 }; 635 636 } // namespace lldb_private 637 638 #endif // liblldb_Function_h_ 639