LLVM  9.0.0svn
DWARFDataExtractor.cpp
Go to the documentation of this file.
1 //===- DWARFDataExtractor.cpp ---------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
12 
13 using namespace llvm;
14 
16  uint64_t *SecNdx) const {
17  if (SecNdx)
19  if (!Section)
20  return getUnsigned(Off, Size);
21  Optional<RelocAddrEntry> E = Obj->find(*Section, *Off);
22  uint64_t A = getUnsigned(Off, Size);
23  if (!E)
24  return A;
25  if (SecNdx)
26  *SecNdx = E->SectionIndex;
27  return E->Resolver(E->Reloc, E->SymbolValue, A);
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 }
object::RelocationResolver Resolver
Definition: DWARFRelocMap.h:23
uint64_t getULEB128(uint32_t *offset_ptr) const
Extract a unsigned LEB128 value from *offset_ptr.
This class represents lattice values for constants.
Definition: AllocatorList.h:23
virtual Optional< RelocAddrEntry > find(const DWARFSection &Sec, uint64_t Pos) const =0
static const uint64_t UndefSection
Definition: ObjectFile.h:145
object::RelocationRef Reloc
Definition: DWARFRelocMap.h:22
int64_t getSLEB128(uint32_t *offset_ptr) const
Extract a signed LEB128 value from *offset_ptr.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
uint8_t getAddressSize() const
Get the address size for this extractor.
Definition: DataExtractor.h:58
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.
uint32_t Size
Definition: Profile.cpp:46