LLVM  7.0.0svn
DWARFDataExtractor.cpp
Go to the documentation of this file.
1 //===- DWARFDataExtractor.cpp ---------------------------------------------===//
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 
13 
14 using namespace llvm;
15 
17  uint64_t *SecNdx) const {
18  if (SecNdx)
19  *SecNdx = -1ULL;
20  if (!Section)
21  return getUnsigned(Off, Size);
22  Optional<RelocAddrEntry> Rel = Obj->find(*Section, *Off);
23  if (!Rel)
24  return getUnsigned(Off, Size);
25  if (SecNdx)
26  *SecNdx = Rel->SectionIndex;
27  return getUnsigned(Off, Size) + Rel->Value;
28 }
29 
32  uint64_t PCRelOffset) const {
33  if (Encoding == dwarf::DW_EH_PE_omit)
34  return None;
35 
36  uint64_t Result = 0;
37  uint32_t OldOffset = *Offset;
38  // First get value
39  switch (Encoding & 0x0F) {
41  switch (getAddressSize()) {
42  case 2:
43  case 4:
44  case 8:
45  Result = getUnsigned(Offset, getAddressSize());
46  break;
47  default:
48  return None;
49  }
50  break;
52  Result = getULEB128(Offset);
53  break;
55  Result = getSLEB128(Offset);
56  break;
58  Result = getUnsigned(Offset, 2);
59  break;
61  Result = getUnsigned(Offset, 4);
62  break;
64  Result = getUnsigned(Offset, 8);
65  break;
67  Result = getSigned(Offset, 2);
68  break;
70  Result = getSigned(Offset, 4);
71  break;
73  Result = getSigned(Offset, 8);
74  break;
75  default:
76  return None;
77  }
78  // Then add relative offset, if required
79  switch (Encoding & 0x70) {
81  // do nothing
82  break;
84  Result += PCRelOffset;
85  break;
90  default:
91  *Offset = OldOffset;
92  return None;
93  }
94 
95  return Result;
96 }
uint64_t getULEB128(uint32_t *offset_ptr) const
Extract a unsigned LEB128 value from *offset_ptr.
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
virtual Optional< RelocAddrEntry > find(const DWARFSection &Sec, uint64_t Pos) const =0
int64_t getSLEB128(uint32_t *offset_ptr) const
Extract a signed LEB128 value from *offset_ptr.
uint8_t getAddressSize() const
Get the address size for this extractor.
Definition: DataExtractor.h:59
int64_t getSigned(uint32_t *offset_ptr, uint32_t size) const
Extract an signed integer of size byte_size from *offset_ptr.
Optional< uint64_t > getEncodedPointer(uint32_t *Offset, uint8_t Encoding, uint64_t AbsPosOffset=0) const
Extracts a DWARF-encoded pointer in Offset using Encoding.
uint64_t getRelocatedValue(uint32_t Size, uint32_t *Off, uint64_t *SectionIndex=nullptr) const
Extracts a value and applies a relocation to the result if one exists for the given offset...
This file contains constants used for implementing Dwarf debug support.
uint64_t getUnsigned(uint32_t *offset_ptr, uint32_t byte_size) const
Extract an unsigned integer of size byte_size from *offset_ptr.
constexpr char Size[]
Key for Kernel::Arg::Metadata::mSize.