1c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===- SymbolicFile.h - Interface that only provides symbols ----*- C++ -*-===//
2c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
3c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//                     The LLVM Compiler Infrastructure
4c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
5c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// This file is distributed under the University of Illinois Open Source
6c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// License. See LICENSE.TXT for details.
7c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
8c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===----------------------------------------------------------------------===//
9c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
10c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// This file declares the SymbolicFile interface.
11c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//
12c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===----------------------------------------------------------------------===//
13c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
14c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#ifndef LLVM_OBJECT_SYMBOLICFILE_H
15c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#define LLVM_OBJECT_SYMBOLICFILE_H
16c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
17c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/ADT/StringRef.h"
18c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/ADT/iterator_range.h"
19c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/BinaryFormat/Magic.h"
20c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Object/Binary.h"
21c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Support/Error.h"
22c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Support/FileSystem.h"
23c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Support/Format.h"
24c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/Support/MemoryBuffer.h"
25c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <cinttypes>
26c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <cstdint>
27c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <cstring>
28c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <iterator>
29c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <memory>
30c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include <system_error>
31c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
32c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace llvm {
33c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace object {
34c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
35c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotunion DataRefImpl {
36c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // This entire union should probably be a
37c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // char[max(8, sizeof(uintptr_t))] and require the impl to cast.
38c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  struct {
39c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    uint32_t a, b;
40c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  } d;
41c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  uintptr_t p;
42c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
43c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  DataRefImpl() { std::memset(this, 0, sizeof(DataRefImpl)); }
44c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot};
45c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
46c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robottemplate <typename OStream>
47c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team RobotOStream& operator<<(OStream &OS, const DataRefImpl &D) {
48c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  OS << "(" << format("0x%08" PRIxPTR, D.p) << " (" << format("0x%08x", D.d.a)
49c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot     << ", " << format("0x%08x", D.d.b) << "))";
50c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return OS;
51c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
52c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
53c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline bool operator==(const DataRefImpl &a, const DataRefImpl &b) {
54c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // Check bitwise identical. This is the only legal way to compare a union w/o
55c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // knowing which member is in use.
56c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return std::memcmp(&a, &b, sizeof(DataRefImpl)) == 0;
57c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
58c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
59c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline bool operator!=(const DataRefImpl &a, const DataRefImpl &b) {
60c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return !operator==(a, b);
61c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
62c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
63c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline bool operator<(const DataRefImpl &a, const DataRefImpl &b) {
64c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // Check bitwise identical. This is the only legal way to compare a union w/o
65c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // knowing which member is in use.
66c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return std::memcmp(&a, &b, sizeof(DataRefImpl)) < 0;
67c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
68c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
69c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robottemplate <class content_type>
70c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass content_iterator
71c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    : public std::iterator<std::forward_iterator_tag, content_type> {
72c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  content_type Current;
73c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
74c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotpublic:
75c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  content_iterator(content_type symb) : Current(std::move(symb)) {}
76c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
77c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const content_type *operator->() const { return &Current; }
78c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
79c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const content_type &operator*() const { return Current; }
80c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
81c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool operator==(const content_iterator &other) const {
82c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return Current == other.Current;
83c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
84c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
85c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool operator!=(const content_iterator &other) const {
86c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return !(*this == other);
87c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
88c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
89c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  content_iterator &operator++() { // preincrement
90c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    Current.moveNext();
91c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return *this;
92c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
93c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot};
94c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
95c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass SymbolicFile;
96c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
97c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// This is a value type class that represents a single symbol in the list of
98c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// symbols in the object file.
99c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass BasicSymbolRef {
100c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  DataRefImpl SymbolPimpl;
101c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const SymbolicFile *OwningObject = nullptr;
102c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
103c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotpublic:
104c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  enum Flags : unsigned {
105c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_None = 0,
106c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Undefined = 1U << 0,      // Symbol is defined in another object file
107c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Global = 1U << 1,         // Global symbol
108c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Weak = 1U << 2,           // Weak symbol
109c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Absolute = 1U << 3,       // Absolute symbol
110c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Common = 1U << 4,         // Symbol has common linkage
111c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Indirect = 1U << 5,       // Symbol is an alias to another symbol
112c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Exported = 1U << 6,       // Symbol is visible to other DSOs
113c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_FormatSpecific = 1U << 7, // Specific to the object file format
114c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot                                 // (e.g. section symbols)
115c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Thumb = 1U << 8,          // Thumb symbol in a 32-bit ARM binary
116c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Hidden = 1U << 9,         // Symbol has hidden visibility
117c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Const = 1U << 10,         // Symbol value is constant
118c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    SF_Executable = 1U << 11,    // Symbol points to an executable section
119c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot                                 // (IR only)
120c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  };
121c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
122c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  BasicSymbolRef() = default;
123c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  BasicSymbolRef(DataRefImpl SymbolP, const SymbolicFile *Owner);
124c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
125c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool operator==(const BasicSymbolRef &Other) const;
126c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  bool operator<(const BasicSymbolRef &Other) const;
127c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
128c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  void moveNext();
129c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
130c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  std::error_code printName(raw_ostream &OS) const;
131c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
132c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  /// Get symbol flags (bitwise OR of SymbolRef::Flags)
133c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  uint32_t getFlags() const;
134c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
135c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  DataRefImpl getRawDataRefImpl() const;
136c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  const SymbolicFile *getObject() const;
137c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot};
138c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
139c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotusing basic_symbol_iterator = content_iterator<BasicSymbolRef>;
140c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
141c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass SymbolicFile : public Binary {
142c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotpublic:
143c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  SymbolicFile(unsigned int Type, MemoryBufferRef Source);
144c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  ~SymbolicFile() override;
145c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
146c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // virtual interface.
147c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  virtual void moveSymbolNext(DataRefImpl &Symb) const = 0;
148c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
149c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  virtual std::error_code printSymbolName(raw_ostream &OS,
150c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot                                          DataRefImpl Symb) const = 0;
151c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
152c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  virtual uint32_t getSymbolFlags(DataRefImpl Symb) const = 0;
153c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
154c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  virtual basic_symbol_iterator symbol_begin() const = 0;
155c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
156c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  virtual basic_symbol_iterator symbol_end() const = 0;
157c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
158c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // convenience wrappers.
159c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  using basic_symbol_iterator_range = iterator_range<basic_symbol_iterator>;
160c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  basic_symbol_iterator_range symbols() const {
161c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return basic_symbol_iterator_range(symbol_begin(), symbol_end());
162c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
163c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
164c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  // construction aux.
165c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  static Expected<std::unique_ptr<SymbolicFile>>
166c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  createSymbolicFile(MemoryBufferRef Object, llvm::file_magic Type,
167c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot                     LLVMContext *Context);
168c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
169c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  static Expected<std::unique_ptr<SymbolicFile>>
170c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  createSymbolicFile(MemoryBufferRef Object) {
171c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return createSymbolicFile(Object, llvm::file_magic::unknown, nullptr);
172c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
173c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  static Expected<OwningBinary<SymbolicFile>>
174c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  createSymbolicFile(StringRef ObjectPath);
175c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
176c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  static bool classof(const Binary *v) {
177c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    return v->isSymbolic();
178c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  }
179c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot};
180c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
181c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline BasicSymbolRef::BasicSymbolRef(DataRefImpl SymbolP,
182c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot                                      const SymbolicFile *Owner)
183c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot    : SymbolPimpl(SymbolP), OwningObject(Owner) {}
184c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
185c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline bool BasicSymbolRef::operator==(const BasicSymbolRef &Other) const {
186c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return SymbolPimpl == Other.SymbolPimpl;
187c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
188c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
189c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline bool BasicSymbolRef::operator<(const BasicSymbolRef &Other) const {
190c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return SymbolPimpl < Other.SymbolPimpl;
191c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
192c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
193c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline void BasicSymbolRef::moveNext() {
194c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return OwningObject->moveSymbolNext(SymbolPimpl);
195c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
196c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
197c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline std::error_code BasicSymbolRef::printName(raw_ostream &OS) const {
198c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return OwningObject->printSymbolName(OS, SymbolPimpl);
199c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
200c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
201c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline uint32_t BasicSymbolRef::getFlags() const {
202c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return OwningObject->getSymbolFlags(SymbolPimpl);
203c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
204c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
205c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline DataRefImpl BasicSymbolRef::getRawDataRefImpl() const {
206c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return SymbolPimpl;
207c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
208c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
209c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotinline const SymbolicFile *BasicSymbolRef::getObject() const {
210c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot  return OwningObject;
211c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}
212c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
213c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace object
214c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace llvm
215c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot
216c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#endif // LLVM_OBJECT_SYMBOLICFILE_H
217