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