//===- InlineInfo.h ---------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_GSYM_INLINEINFO_H #define LLVM_DEBUGINFO_GSYM_INLINEINFO_H #include "llvm/ADT/Optional.h" #include "llvm/DebugInfo/GSYM/Range.h" #include #include namespace llvm { class raw_ostream; namespace gsym { /// Inline information stores the name of the inline function along with /// an array of address ranges. It also stores the call file and call line /// that called this inline function. This allows us to unwind inline call /// stacks back to the inline or concrete function that called this /// function. Inlined functions contained in this function are stored in the /// "Children" variable. All address ranges must be sorted and all address /// ranges of all children must be contained in the ranges of this function. /// Any clients that encode information will need to ensure the ranges are /// all contined correctly or lookups could fail. Add ranges in these objects /// must be contained in the top level FunctionInfo address ranges as well. struct InlineInfo { uint32_t Name; ///< String table offset in the string table. uint32_t CallFile; ///< 1 based file index in the file table. uint32_t CallLine; ///< Source line number. AddressRanges Ranges; std::vector Children; InlineInfo() : Name(0), CallFile(0), CallLine(0) {} void clear() { Name = 0; CallFile = 0; CallLine = 0; Ranges.clear(); Children.clear(); } bool isValid() const { return !Ranges.empty(); } using InlineArray = std::vector; /// Lookup an address in the InlineInfo object /// /// This function is used to symbolicate an inline call stack and can /// turn one address in the program into one or more inline call stacks /// and have the stack trace show the original call site from /// non-inlined code. /// /// \param Addr the address to lookup /// /// \returns optional vector of InlineInfo objects that describe the /// inline call stack for a given address, false otherwise. llvm::Optional getInlineStack(uint64_t Addr) const; }; inline bool operator==(const InlineInfo &LHS, const InlineInfo &RHS) { return LHS.Name == RHS.Name && LHS.CallFile == RHS.CallFile && LHS.CallLine == RHS.CallLine && LHS.Ranges == RHS.Ranges && LHS.Children == RHS.Children; } raw_ostream &operator<<(raw_ostream &OS, const InlineInfo &FI); } // namespace gsym } // namespace llvm #endif // #ifndef LLVM_DEBUGINFO_GSYM_INLINEINFO_H