LLVM 20.0.0git
|
Inline information stores the name of the inline function along with an array of address ranges. More...
#include "llvm/DebugInfo/GSYM/InlineInfo.h"
Public Types | |
using | InlineArray = std::vector< const InlineInfo * > |
Public Member Functions | |
InlineInfo () | |
void | clear () |
bool | isValid () const |
std::optional< InlineArray > | getInlineStack (uint64_t Addr) const |
Lookup an address in the InlineInfo object. | |
llvm::Error | encode (FileWriter &O, uint64_t BaseAddr) const |
Encode this InlineInfo object into FileWriter stream. | |
bool | operator< (const InlineInfo &RHS) const |
Compare InlineInfo objects. | |
Static Public Member Functions | |
static llvm::Error | lookup (const GsymReader &GR, DataExtractor &Data, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs) |
Lookup a single address within the inline info data. | |
static llvm::Expected< InlineInfo > | decode (DataExtractor &Data, uint64_t BaseAddr) |
Decode an InlineInfo object from a binary data stream. | |
Public Attributes | |
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< InlineInfo > | Children |
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.
ENCODING
When saved to disk, the inline info encodes all ranges to be relative to a parent address range. This will be the FunctionInfo's start address if the InlineInfo is directly contained in a FunctionInfo, or a the start address of the containing parent InlineInfo's first "Ranges" member. This allows address ranges to be efficiently encoded using ULEB128 encodings as we encode the offset and size of each range instead of full addresses. This also makes any encoded addresses easy to relocate as we just need to relocate the FunctionInfo's start address.
Definition at line 59 of file InlineInfo.h.
using llvm::gsym::InlineInfo::InlineArray = std::vector<const InlineInfo *> |
Definition at line 76 of file InlineInfo.h.
|
inline |
Definition at line 66 of file InlineInfo.h.
|
inline |
Definition at line 67 of file InlineInfo.h.
References CallFile, CallLine, Children, llvm::AddressRangesBase< T >::clear(), Name, and Ranges.
|
static |
Decode an InlineInfo object from a binary data stream.
Data | The binary stream to read the data from. This object must have the data for the InlineInfo object starting at offset zero. The data can contain more data than needed. |
BaseAddr | The base address to use when decoding all address ranges. This will be the FunctionInfo's start address if this object is directly contained in a FunctionInfo object, or the start address of the first address range in an InlineInfo object of this object is a child of another InlineInfo object. |
Definition at line 223 of file InlineInfo.cpp.
References llvm::Data, and llvm::Offset.
Referenced by llvm::gsym::FunctionInfo::decode().
llvm::Error InlineInfo::encode | ( | FileWriter & | O, |
uint64_t | BaseAddr | ||
) | const |
Encode this InlineInfo object into FileWriter stream.
O | The binary stream to write the data to at the current file position. |
BaseAddr | The base address to use when encoding all address ranges. This will be the FunctionInfo's start address if this object is directly contained in a FunctionInfo object, or the start address of the first address range in an InlineInfo object of this object is a child of another InlineInfo object. |
Definition at line 229 of file InlineInfo.cpp.
References CallFile, CallLine, Children, llvm::AddressRangesBase< T >::contains(), llvm::createStringError(), llvm::gsym::encodeRanges(), isValid(), Name, Ranges, and llvm::Error::success().
std::optional< InlineInfo::InlineArray > InlineInfo::getInlineStack | ( | uint64_t | Addr | ) | const |
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.
Addr | the address to lookup |
Definition at line 57 of file InlineInfo.cpp.
References Addr, and getInlineStackHelper().
|
inline |
Definition at line 74 of file InlineInfo.h.
References llvm::AddressRangesBase< T >::empty(), and Ranges.
Referenced by encode().
|
static |
Lookup a single address within the inline info data.
Clients have the option to decode an entire InlineInfo object (using InlineInfo::decode() ) or just find the matching inline info using this function. The benefit of using this function is that only the information needed for the lookup will be extracted, other info can be skipped and parsing can stop as soon as the deepest match is found. This allows symbolication tools to be fast and efficient and avoid allocation costs when doing lookups.
This function will augment the SourceLocations array SrcLocs with any inline information that pertains to Addr. If no inline information exists for Addr, then SrcLocs will be left untouched. If there is inline information for Addr, then SrcLocs will be modifiied to contain the deepest most inline function's SourceLocation at index zero in the array and proceed up the concrete function source file and line at the end of the array.
GR | The GSYM reader that contains the string and file table that will be used to fill in the source locations. |
Data | The binary stream to read the data from. This object must have the data for the LineTable object starting at offset zero. The data can contain more data than needed. |
BaseAddr | The base address to use when decoding the line table. This will be the FunctionInfo's start address and will be used to decode the correct addresses for the inline information. |
Addr | The address to lookup. |
SrcLocs | The inline source locations that matches Addr. This array must be initialized with the matching line entry from the line table upon entry. The name of the concrete function must be supplied since it will get pushed to the last SourceLocation entry and the inline information will fill in the source file and line from the inline information. |
Definition at line 160 of file InlineInfo.cpp.
References Addr, llvm::Data, lookup(), llvm::Offset, and llvm::Error::success().
Referenced by lookup(), and llvm::gsym::FunctionInfo::lookup().
bool InlineInfo::operator< | ( | const InlineInfo & | RHS | ) | const |
Compare InlineInfo objects.
When comparing InlineInfo objects the item with the most inline functions wins. If we have two FunctionInfo objects that both have the same address range and both have valid InlineInfo objects, we want the one with the most inline functions to win so we save the most information possible to the GSYM file. We have seen cases where LTO messes up the inline function information for the same address range, so this helps ensure we get the most descriptive information we can for an address range.
Definition at line 275 of file InlineInfo.cpp.
References GetTotalNumChildren(), and RHS.
uint32_t llvm::gsym::InlineInfo::CallFile |
1 based file index in the file table.
Definition at line 62 of file InlineInfo.h.
uint32_t llvm::gsym::InlineInfo::CallLine |
Source line number.
Definition at line 63 of file InlineInfo.h.
std::vector<InlineInfo> llvm::gsym::InlineInfo::Children |
Definition at line 65 of file InlineInfo.h.
Referenced by clear(), encode(), and parseInlineInfo().
uint32_t llvm::gsym::InlineInfo::Name |
String table offset in the string table.
Definition at line 61 of file InlineInfo.h.
AddressRanges llvm::gsym::InlineInfo::Ranges |
Definition at line 64 of file InlineInfo.h.
Referenced by clear(), encode(), isValid(), and parseInlineInfo().