LLVM: lib/DebugInfo/DWARF/DWARFDebugAddr.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
13
14using namespace llvm;
15
19 assert(EndOffset >= *OffsetPtr);
20 uint64_t DataSize = EndOffset - *OffsetPtr;
24 Offset))
25 return SizeErr;
26 if (DataSize % AddrSize != 0) {
27 invalidateLength();
29 "address table at offset 0x%" PRIx64
30 " contains data of size 0x%" PRIx64
31 " which is not a multiple of addr size %" PRIu8,
33 }
34 Addrs.clear();
36 Addrs.reserve(Count);
38 Addrs.push_back(Data.getRelocatedValue(AddrSize, OffsetPtr));
40}
41
44 std::function<void(Error)> WarnCallback) {
45 Offset = *OffsetPtr;
47 std::tie(Length, Format) = Data.getInitialLength(OffsetPtr, &Err);
48 if (Err) {
49 invalidateLength();
51 "parsing address table at offset 0x%" PRIx64
52 ": %s",
54 }
55
56 if (.isValidOffsetForDataOfSize(*OffsetPtr, Length)) {
57 uint64_t DiagnosticLength = Length;
58 invalidateLength();
61 "section is not large enough to contain an address table "
62 "at offset 0x%" PRIx64 " with a unit_length value of 0x%" PRIx64,
63 Offset, DiagnosticLength);
64 }
65 uint64_t EndOffset = *OffsetPtr + Length;
66
67 if (Length < 4) {
68 uint64_t DiagnosticLength = Length;
69 invalidateLength();
72 "address table at offset 0x%" PRIx64
73 " has a unit_length value of 0x%" PRIx64
74 ", which is too small to contain a complete header",
75 Offset, DiagnosticLength);
76 }
77
78 Version = Data.getU16(OffsetPtr);
79 AddrSize = Data.getU8(OffsetPtr);
80 SegSize = Data.getU8(OffsetPtr);
81
82
83 if (Version != 5)
85 "address table at offset 0x%" PRIx64
86 " has unsupported version %" PRIu16,
87 Offset, Version);
88
89 if (SegSize != 0)
91 "address table at offset 0x%" PRIx64
92 " has unsupported segment selector size %" PRIu8,
93 Offset, SegSize);
94
95 if (Error Err = extractAddresses(Data, OffsetPtr, EndOffset))
96 return Err;
97 if (CUAddrSize && AddrSize != CUAddrSize) {
100 "address table at offset 0x%" PRIx64 " has address size %" PRIu8
101 " which is different from CU address size %" PRIu8,
102 Offset, AddrSize, CUAddrSize));
103 }
105}
106
111 assert(CUVersion > 0 && CUVersion < 5);
112
113 Offset = *OffsetPtr;
114 Length = 0;
115 Version = CUVersion;
116 AddrSize = CUAddrSize;
117 SegSize = 0;
118
119 return extractAddresses(Data, OffsetPtr, Data.size());
120}
121
126 std::function<void(Error)> WarnCallback) {
127 if (CUVersion > 0 && CUVersion < 5)
129 if (CUVersion == 0)
131 "DWARF version is not defined in CU,"
132 " assuming version 5"));
133 return extractV5(Data, OffsetPtr, CUAddrSize, WarnCallback);
134}
135
138 OS << format("0x%8.8" PRIx64 ": ", Offset);
139 if (Length) {
141 OS << "Address table header: "
142 << format("length = 0x%0*" PRIx64, OffsetDumpWidth, Length)
144 << format(", version = 0x%4.4" PRIx16, Version)
145 << format(", addr_size = 0x%2.2" PRIx8, AddrSize)
146 << format(", seg_size = 0x%2.2" PRIx8, SegSize) << "\n";
147 }
148
149 if (Addrs.size() > 0) {
150 const char *AddrFmt;
151 switch (AddrSize) {
152 case 2:
153 AddrFmt = "0x%4.4" PRIx64 "\n";
154 break;
155 case 4:
156 AddrFmt = "0x%8.8" PRIx64 "\n";
157 break;
158 case 8:
159 AddrFmt = "0x%16.16" PRIx64 "\n";
160 break;
161 default:
163 }
164 OS << "Addrs: [\n";
166 OS << format(AddrFmt, Addr);
167 OS << "]\n";
168 }
169}
170
172 if (Index < Addrs.size())
173 return Addrs[Index];
175 "Index %" PRIu32 " is out of range of the "
176 "address table at offset 0x%" PRIx64,
177 Index, Offset);
178}
179
181 if (Length == 0)
182 return std::nullopt;
184}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains constants used for implementing Dwarf debug support.
static Error checkAddressSizeSupported(unsigned AddressSize, std::error_code EC, char const *Fmt, const Ts &...Vals)
void dump(raw_ostream &OS, DIDumpOptions DumpOpts={}) const
Definition DWARFDebugAddr.cpp:136
Error extract(const DWARFDataExtractor &Data, uint64_t *OffsetPtr, uint16_t CUVersion, uint8_t CUAddrSize, std::function< void(Error)> WarnCallback)
Extract the entire table, including all addresses.
Definition DWARFDebugAddr.cpp:122
Error extractV5(const DWARFDataExtractor &Data, uint64_t *OffsetPtr, uint8_t CUAddrSize, std::function< void(Error)> WarnCallback)
Extract a DWARFv5 address table.
Definition DWARFDebugAddr.cpp:42
Error extractPreStandard(const DWARFDataExtractor &Data, uint64_t *OffsetPtr, uint16_t CUVersion, uint8_t CUAddrSize)
Extract a pre-DWARFv5 address table.
Definition DWARFDebugAddr.cpp:107
std::optional< uint64_t > getFullLength() const
Return the full length of this table, including the length field.
Definition DWARFDebugAddr.cpp:180
Expected< uint64_t > getAddrEntry(uint32_t Index) const
Return the address based on a given index.
Definition DWARFDebugAddr.cpp:171
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
This class implements an extremely fast bulk output stream that can only output to a stream.
LLVM_ABI StringRef FormatString(DwarfFormat Format)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
This is an optimization pass for GlobalISel generic memory operations.
SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)
FunctionAddr VTableAddr uintptr_t uintptr_t DataSize
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
FunctionAddr VTableAddr Count
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
Container for dump options that control which debug information will be dumped.