diff options
Diffstat (limited to 'include/llvm/Object/MachO.h')
| -rw-r--r-- | include/llvm/Object/MachO.h | 41 | 
1 files changed, 33 insertions, 8 deletions
| diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 2c3c89d10546..d0cc40da4293 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -66,11 +66,13 @@ using dice_iterator = content_iterator<DiceRef>;  /// ExportEntry encapsulates the current-state-of-the-walk used when doing a  /// non-recursive walk of the trie data structure.  This allows you to iterate  /// across all exported symbols using: -///      for (const llvm::object::ExportEntry &AnExport : Obj->exports()) { +///      Error Err; +///      for (const llvm::object::ExportEntry &AnExport : Obj->exports(&Err)) {  ///      } +///      if (Err) { report error ...  class ExportEntry {  public: -  ExportEntry(ArrayRef<uint8_t> Trie); +  ExportEntry(Error *Err, const MachOObjectFile *O, ArrayRef<uint8_t> Trie);    StringRef name() const;    uint64_t flags() const; @@ -88,7 +90,7 @@ private:    void moveToFirst();    void moveToEnd(); -  uint64_t readULEB128(const uint8_t *&p); +  uint64_t readULEB128(const uint8_t *&p, const char **error);    void pushDownUntilBottom();    void pushNode(uint64_t Offset); @@ -107,12 +109,19 @@ private:      unsigned ParentStringLength = 0;      bool IsExportNode = false;    }; +  using NodeList = SmallVector<NodeState, 16>; +  using node_iterator = NodeList::const_iterator; +  Error *E; +  const MachOObjectFile *O;    ArrayRef<uint8_t> Trie;    SmallString<256> CumulativeString; -  SmallVector<NodeState, 16> Stack; -  bool Malformed = false; +  NodeList Stack;    bool Done = false; + +  iterator_range<node_iterator> nodes() const { +    return make_range(Stack.begin(), Stack.end()); +  }  };  using export_iterator = content_iterator<ExportEntry>; @@ -301,6 +310,16 @@ public:    bool isSectionBSS(DataRefImpl Sec) const override;    bool isSectionVirtual(DataRefImpl Sec) const override;    bool isSectionBitcode(DataRefImpl Sec) const override; + +  /// When dsymutil generates the companion file, it strips all unnecessary +  /// sections (e.g. everything in the _TEXT segment) by omitting their body +  /// and setting the offset in their corresponding load command to zero. +  /// +  /// While the load command itself is valid, reading the section corresponds +  /// to reading the number of bytes specified in the load command, starting +  /// from offset 0 (i.e. the Mach-O header at the beginning of the file). +  bool isSectionStripped(DataRefImpl Sec) const override; +    relocation_iterator section_rel_begin(DataRefImpl Sec) const override;    relocation_iterator section_rel_end(DataRefImpl Sec) const override; @@ -310,6 +329,9 @@ public:      return make_range(extrel_begin(), extrel_end());    } +  relocation_iterator locrel_begin() const; +  relocation_iterator locrel_end() const; +      void moveRelocationNext(DataRefImpl &Rel) const override;    uint64_t getRelocationOffset(DataRefImpl Rel) const override;    symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override; @@ -341,7 +363,7 @@ public:    uint8_t getBytesInAddress() const override;    StringRef getFileFormatName() const override; -  unsigned getArch() const override; +  Triple::ArchType getArch() const override;    SubtargetFeatures getFeatures() const override { return SubtargetFeatures(); }    Triple getArchTriple(const char **McpuDefault = nullptr) const; @@ -356,10 +378,13 @@ public:    iterator_range<load_command_iterator> load_commands() const;    /// For use iterating over all exported symbols. -  iterator_range<export_iterator> exports() const; +  iterator_range<export_iterator> exports(Error &Err) const;    /// For use examining a trie not in a MachOObjectFile. -  static iterator_range<export_iterator> exports(ArrayRef<uint8_t> Trie); +  static iterator_range<export_iterator> exports(Error &Err, +                                                 ArrayRef<uint8_t> Trie, +                                                 const MachOObjectFile *O = +                                                                      nullptr);    /// For use iterating over all rebase table entries.    iterator_range<rebase_iterator> rebaseTable(Error &Err); | 
