LLVM  16.0.0git
SymbolicFile.h
Go to the documentation of this file.
1 //===- SymbolicFile.h - Interface that only provides symbols ----*- C++ -*-===//
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 //
9 // This file declares the SymbolicFile interface.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_OBJECT_SYMBOLICFILE_H
14 #define LLVM_OBJECT_SYMBOLICFILE_H
15 
18 #include "llvm/Object/Binary.h"
19 #include "llvm/Support/Error.h"
20 #include "llvm/Support/Format.h"
22 #include <cinttypes>
23 #include <cstdint>
24 #include <cstring>
25 #include <iterator>
26 #include <memory>
27 
28 namespace llvm {
29 
30 class LLVMContext;
31 class raw_ostream;
32 
33 namespace object {
34 
35 union DataRefImpl {
36  // This entire union should probably be a
37  // char[max(8, sizeof(uintptr_t))] and require the impl to cast.
38  struct {
40  } d;
41  uintptr_t p;
42 
43  DataRefImpl() { std::memset(this, 0, sizeof(DataRefImpl)); }
44 };
45 
46 template <typename OStream>
47 OStream& operator<<(OStream &OS, const DataRefImpl &D) {
48  OS << "(" << format("0x%08" PRIxPTR, D.p) << " (" << format("0x%08x", D.d.a)
49  << ", " << format("0x%08x", D.d.b) << "))";
50  return OS;
51 }
52 
53 inline bool operator==(const DataRefImpl &a, const DataRefImpl &b) {
54  // Check bitwise identical. This is the only legal way to compare a union w/o
55  // knowing which member is in use.
56  return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0;
57 }
58 
59 inline bool operator!=(const DataRefImpl &a, const DataRefImpl &b) {
60  return !operator==(a, b);
61 }
62 
63 inline bool operator<(const DataRefImpl &a, const DataRefImpl &b) {
64  // Check bitwise identical. This is the only legal way to compare a union w/o
65  // knowing which member is in use.
66  return std::memcmp(&a, &b, sizeof(DataRefImpl)) < 0;
67 }
68 
69 template <class content_type> class content_iterator {
70  content_type Current;
71 
72 public:
73  using iterator_category = std::forward_iterator_tag;
74  using value_type = content_type;
75  using difference_type = std::ptrdiff_t;
76  using pointer = value_type *;
77  using reference = value_type &;
78 
79  content_iterator(content_type symb) : Current(std::move(symb)) {}
80 
81  const content_type *operator->() const { return &Current; }
82 
83  const content_type &operator*() const { return Current; }
84 
85  bool operator==(const content_iterator &other) const {
86  return Current == other.Current;
87  }
88 
89  bool operator!=(const content_iterator &other) const {
90  return !(*this == other);
91  }
92 
93  content_iterator &operator++() { // preincrement
94  Current.moveNext();
95  return *this;
96  }
97 };
98 
99 class SymbolicFile;
100 
101 /// This is a value type class that represents a single symbol in the list of
102 /// symbols in the object file.
104  DataRefImpl SymbolPimpl;
105  const SymbolicFile *OwningObject = nullptr;
106 
107 public:
108  enum Flags : unsigned {
109  SF_None = 0,
110  SF_Undefined = 1U << 0, // Symbol is defined in another object file
111  SF_Global = 1U << 1, // Global symbol
112  SF_Weak = 1U << 2, // Weak symbol
113  SF_Absolute = 1U << 3, // Absolute symbol
114  SF_Common = 1U << 4, // Symbol has common linkage
115  SF_Indirect = 1U << 5, // Symbol is an alias to another symbol
116  SF_Exported = 1U << 6, // Symbol is visible to other DSOs
117  SF_FormatSpecific = 1U << 7, // Specific to the object file format
118  // (e.g. section symbols)
119  SF_Thumb = 1U << 8, // Thumb symbol in a 32-bit ARM binary
120  SF_Hidden = 1U << 9, // Symbol has hidden visibility
121  SF_Const = 1U << 10, // Symbol value is constant
122  SF_Executable = 1U << 11, // Symbol points to an executable section
123  // (IR only)
124  };
125 
126  BasicSymbolRef() = default;
127  BasicSymbolRef(DataRefImpl SymbolP, const SymbolicFile *Owner);
128 
129  bool operator==(const BasicSymbolRef &Other) const;
130  bool operator<(const BasicSymbolRef &Other) const;
131 
132  void moveNext();
133 
134  Error printName(raw_ostream &OS) const;
135 
136  /// Get symbol flags (bitwise OR of SymbolRef::Flags)
138 
140  const SymbolicFile *getObject() const;
141 };
142 
144 
145 class SymbolicFile : public Binary {
146 public:
147  SymbolicFile(unsigned int Type, MemoryBufferRef Source);
148  ~SymbolicFile() override;
149 
150  // virtual interface.
151  virtual void moveSymbolNext(DataRefImpl &Symb) const = 0;
152 
153  virtual Error printSymbolName(raw_ostream &OS, DataRefImpl Symb) const = 0;
154 
155  virtual Expected<uint32_t> getSymbolFlags(DataRefImpl Symb) const = 0;
156 
157  virtual basic_symbol_iterator symbol_begin() const = 0;
158 
159  virtual basic_symbol_iterator symbol_end() const = 0;
160 
161  // convenience wrappers.
165  }
166 
167  // construction aux.
170  LLVMContext *Context, bool InitContent = true);
171 
175  }
176 
177  static bool classof(const Binary *v) {
178  return v->isSymbolic();
179  }
180 
181  static bool isSymbolicFile(file_magic Type, const LLVMContext *Context);
182 };
183 
185  const SymbolicFile *Owner)
186  : SymbolPimpl(SymbolP), OwningObject(Owner) {}
187 
188 inline bool BasicSymbolRef::operator==(const BasicSymbolRef &Other) const {
189  return SymbolPimpl == Other.SymbolPimpl;
190 }
191 
192 inline bool BasicSymbolRef::operator<(const BasicSymbolRef &Other) const {
193  return SymbolPimpl < Other.SymbolPimpl;
194 }
195 
197  return OwningObject->moveSymbolNext(SymbolPimpl);
198 }
199 
201  return OwningObject->printSymbolName(OS, SymbolPimpl);
202 }
203 
205  return OwningObject->getSymbolFlags(SymbolPimpl);
206 }
207 
209  return SymbolPimpl;
210 }
211 
213  return OwningObject;
214 }
215 
216 } // end namespace object
217 } // end namespace llvm
218 
219 #endif // LLVM_OBJECT_SYMBOLICFILE_H
llvm::object::DataRefImpl::DataRefImpl
DataRefImpl()
Definition: SymbolicFile.h:43
llvm::file_magic::unknown
@ unknown
Unrecognized file.
Definition: Magic.h:22
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::object::DataRefImpl::a
uint32_t a
Definition: SymbolicFile.h:39
llvm::file_magic
file_magic - An "enum class" enumeration of file types based on magic (the first N bytes of the file)...
Definition: Magic.h:20
llvm::object::content_iterator::operator==
bool operator==(const content_iterator &other) const
Definition: SymbolicFile.h:85
llvm::object::BasicSymbolRef::SF_Indirect
@ SF_Indirect
Definition: SymbolicFile.h:115
llvm::object::BasicSymbolRef::SF_Common
@ SF_Common
Definition: SymbolicFile.h:114
llvm::object::content_iterator::operator!=
bool operator!=(const content_iterator &other) const
Definition: SymbolicFile.h:89
llvm::object::SymbolicFile::printSymbolName
virtual Error printSymbolName(raw_ostream &OS, DataRefImpl Symb) const =0
memcmp
Merge contiguous icmps into a memcmp
Definition: MergeICmps.cpp:899
Error.h
llvm::object::BasicSymbolRef::SF_Exported
@ SF_Exported
Definition: SymbolicFile.h:116
MemoryBufferRef.h
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
llvm::object::SymbolicFile::moveSymbolNext
virtual void moveSymbolNext(DataRefImpl &Symb) const =0
llvm::object::BasicSymbolRef::Flags
Flags
Definition: SymbolicFile.h:108
llvm::Expected
Tagged union holding either a T or a Error.
Definition: APFloat.h:41
llvm::object::BasicSymbolRef::SF_Weak
@ SF_Weak
Definition: SymbolicFile.h:112
Format.h
llvm::MemoryBufferRef
Definition: MemoryBufferRef.h:22
llvm::object::BasicSymbolRef::SF_Executable
@ SF_Executable
Definition: SymbolicFile.h:122
llvm::object::BasicSymbolRef::printName
Error printName(raw_ostream &OS) const
Definition: SymbolicFile.h:200
a
=0.0 ? 0.0 :(a > 0.0 ? 1.0 :-1.0) a
Definition: README.txt:489
Context
LLVMContext & Context
Definition: NVVMIntrRange.cpp:66
llvm::object::SymbolicFile::symbol_end
virtual basic_symbol_iterator symbol_end() const =0
llvm::object::DataRefImpl::d
struct llvm::object::DataRefImpl::@339 d
llvm::object::SymbolicFile::getSymbolFlags
virtual Expected< uint32_t > getSymbolFlags(DataRefImpl Symb) const =0
Magic.h
llvm::object::BasicSymbolRef::getRawDataRefImpl
DataRefImpl getRawDataRefImpl() const
Definition: SymbolicFile.h:208
llvm::object::BasicSymbolRef
This is a value type class that represents a single symbol in the list of symbols in the object file.
Definition: SymbolicFile.h:103
llvm::object::content_iterator::value_type
content_type value_type
Definition: SymbolicFile.h:74
b
the resulting code requires compare and branches when and if the revised code is with conditional branches instead of More there is a byte word extend before each where there should be only and the condition codes are not remembered when the same two values are compared twice More LSR enhancements i8 and i32 load store addressing modes are identical int b
Definition: README.txt:418
llvm::object::content_iterator::operator*
const content_type & operator*() const
Definition: SymbolicFile.h:83
llvm::object::content_iterator::pointer
value_type * pointer
Definition: SymbolicFile.h:76
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
llvm::object::SymbolicFile::symbols
basic_symbol_iterator_range symbols() const
Definition: SymbolicFile.h:163
llvm::object::DataRefImpl::p
uintptr_t p
Definition: SymbolicFile.h:41
llvm::object::BasicSymbolRef::getObject
const SymbolicFile * getObject() const
Definition: SymbolicFile.h:212
llvm::OutputFileType::Object
@ Object
llvm::object::SymbolicFile::isSymbolicFile
static bool isSymbolicFile(file_magic Type, const LLVMContext *Context)
Definition: SymbolicFile.cpp:98
llvm::object::operator<<
raw_ostream & operator<<(raw_ostream &OS, const SectionedAddress &Addr)
Definition: ObjectFile.cpp:34
llvm::object::BasicSymbolRef::SF_Const
@ SF_Const
Definition: SymbolicFile.h:121
llvm::object::Binary::isSymbolic
bool isSymbolic() const
Definition: Binary.h:110
object
bar al al movzbl eax ret Missed when stored in a memory object
Definition: README.txt:1411
llvm::object::BasicSymbolRef::SF_FormatSpecific
@ SF_FormatSpecific
Definition: SymbolicFile.h:117
llvm::object::BasicSymbolRef::getFlags
Expected< uint32_t > getFlags() const
Get symbol flags (bitwise OR of SymbolRef::Flags)
Definition: SymbolicFile.h:204
D
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
llvm::object::BasicSymbolRef::SF_None
@ SF_None
Definition: SymbolicFile.h:109
llvm::LLVMContext
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
llvm::object::SymbolicFile::basic_symbol_iterator_range
iterator_range< basic_symbol_iterator > basic_symbol_iterator_range
Definition: SymbolicFile.h:162
llvm::object::BasicSymbolRef::SF_Undefined
@ SF_Undefined
Definition: SymbolicFile.h:110
llvm::object::content_iterator::iterator_category
std::forward_iterator_tag iterator_category
Definition: SymbolicFile.h:73
llvm::object::SymbolicFile::createSymbolicFile
static Expected< std::unique_ptr< SymbolicFile > > createSymbolicFile(MemoryBufferRef Object)
Definition: SymbolicFile.h:173
llvm::object::BasicSymbolRef::SF_Thumb
@ SF_Thumb
Definition: SymbolicFile.h:119
llvm::move
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1666
llvm::object::content_iterator
Definition: SymbolicFile.h:69
llvm::object::content_iterator::operator->
const content_type * operator->() const
Definition: SymbolicFile.h:81
iterator_range.h
llvm::object::BasicSymbolRef::operator<
bool operator<(const BasicSymbolRef &Other) const
Definition: SymbolicFile.h:192
llvm::object::operator!=
bool operator!=(const DataRefImpl &a, const DataRefImpl &b)
Definition: SymbolicFile.h:59
llvm::Sched::Source
@ Source
Definition: TargetLowering.h:98
llvm::object::content_iterator::reference
value_type & reference
Definition: SymbolicFile.h:77
llvm::object::Binary
Definition: Binary.h:32
uint32_t
llvm::object::SymbolicFile::symbol_begin
virtual basic_symbol_iterator symbol_begin() const =0
llvm::object::DataRefImpl
Definition: SymbolicFile.h:35
llvm::object::SymbolicFile::SymbolicFile
SymbolicFile(unsigned int Type, MemoryBufferRef Source)
Definition: SymbolicFile.cpp:31
llvm::format
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:124
llvm::object::operator<
bool operator<(const SectionedAddress &LHS, const SectionedAddress &RHS)
Definition: ObjectFile.h:151
llvm::object::BasicSymbolRef::BasicSymbolRef
BasicSymbolRef()=default
std
Definition: BitVector.h:851
llvm::object::content_iterator::operator++
content_iterator & operator++()
Definition: SymbolicFile.h:93
llvm::Error
Lightweight error class with error context and mandatory checking.
Definition: Error.h:155
llvm::object::SymbolicFile::createSymbolicFile
static Expected< std::unique_ptr< SymbolicFile > > createSymbolicFile(MemoryBufferRef Object, llvm::file_magic Type, LLVMContext *Context, bool InitContent=true)
llvm::object::BasicSymbolRef::SF_Absolute
@ SF_Absolute
Definition: SymbolicFile.h:113
llvm::object::operator==
bool operator==(const SectionedAddress &LHS, const SectionedAddress &RHS)
Definition: ObjectFile.h:157
Binary.h
llvm::object::BasicSymbolRef::moveNext
void moveNext()
Definition: SymbolicFile.h:196
llvm::object::BasicSymbolRef::SF_Global
@ SF_Global
Definition: SymbolicFile.h:111
llvm::object::BasicSymbolRef::SF_Hidden
@ SF_Hidden
Definition: SymbolicFile.h:120
llvm::iterator_range
A range adaptor for a pair of iterators.
Definition: iterator_range.h:30
llvm::object::content_iterator::difference_type
std::ptrdiff_t difference_type
Definition: SymbolicFile.h:75
llvm::object::content_iterator::content_iterator
content_iterator(content_type symb)
Definition: SymbolicFile.h:79
llvm::object::SymbolicFile::classof
static bool classof(const Binary *v)
Definition: SymbolicFile.h:177
llvm::object::DataRefImpl::b
uint32_t b
Definition: SymbolicFile.h:39
llvm::object::SymbolicFile::~SymbolicFile
~SymbolicFile() override
llvm::object::SymbolicFile
Definition: SymbolicFile.h:145
llvm::object::BasicSymbolRef::operator==
bool operator==(const BasicSymbolRef &Other) const
Definition: SymbolicFile.h:188
Other
Optional< std::vector< StOtherPiece > > Other
Definition: ELFYAML.cpp:1247