1 //===- Archive.h - ar archive file format -----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file declares the ar archive file format class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_OBJECT_ARCHIVE_H 15 #define LLVM_OBJECT_ARCHIVE_H 16 17 #include "llvm/Object/Binary.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/Support/DataTypes.h" 20 21 namespace llvm { 22 namespace object { 23 24 class Archive : public Binary { 25 virtual void anchor(); 26 public: 27 class Child { 28 const Archive *Parent; 29 StringRef Data; 30 31 public: Child(const Archive * p,StringRef d)32 Child(const Archive *p, StringRef d) : Parent(p), Data(d) {} 33 34 bool operator ==(const Child &other) const { 35 return (Parent == other.Parent) && (Data.begin() == other.Data.begin()); 36 } 37 38 bool operator <(const Child &other) const { 39 return Data.begin() < other.Data.begin(); 40 } 41 42 Child getNext() const; 43 error_code getName(StringRef &Result) const; 44 int getLastModified() const; 45 int getUID() const; 46 int getGID() const; 47 int getAccessMode() const; 48 ///! Return the size of the archive member without the header or padding. 49 uint64_t getSize() const; 50 51 MemoryBuffer *getBuffer() const; 52 error_code getAsBinary(OwningPtr<Binary> &Result) const; 53 }; 54 55 class child_iterator { 56 Child child; 57 public: child_iterator()58 child_iterator() : child(Child(0, StringRef())) {} child_iterator(const Child & c)59 child_iterator(const Child &c) : child(c) {} 60 const Child* operator->() const { 61 return &child; 62 } 63 64 bool operator==(const child_iterator &other) const { 65 return child == other.child; 66 } 67 68 bool operator!=(const child_iterator &other) const { 69 return !(*this == other); 70 } 71 72 bool operator <(const child_iterator &other) const { 73 return child < other.child; 74 } 75 76 child_iterator& operator++() { // Preincrement 77 child = child.getNext(); 78 return *this; 79 } 80 }; 81 82 class Symbol { 83 const Archive *Parent; 84 uint32_t SymbolIndex; 85 uint32_t StringIndex; // Extra index to the string. 86 87 public: 88 bool operator ==(const Symbol &other) const { 89 return (Parent == other.Parent) && (SymbolIndex == other.SymbolIndex); 90 } 91 Symbol(const Archive * p,uint32_t symi,uint32_t stri)92 Symbol(const Archive *p, uint32_t symi, uint32_t stri) 93 : Parent(p) 94 , SymbolIndex(symi) 95 , StringIndex(stri) {} 96 error_code getName(StringRef &Result) const; 97 error_code getMember(child_iterator &Result) const; 98 Symbol getNext() const; 99 }; 100 101 class symbol_iterator { 102 Symbol symbol; 103 public: symbol_iterator(const Symbol & s)104 symbol_iterator(const Symbol &s) : symbol(s) {} 105 const Symbol *operator->() const { 106 return &symbol; 107 } 108 109 bool operator==(const symbol_iterator &other) const { 110 return symbol == other.symbol; 111 } 112 113 bool operator!=(const symbol_iterator &other) const { 114 return !(*this == other); 115 } 116 117 symbol_iterator& operator++() { // Preincrement 118 symbol = symbol.getNext(); 119 return *this; 120 } 121 }; 122 123 Archive(MemoryBuffer *source, error_code &ec); 124 125 child_iterator begin_children(bool skip_internal = true) const; 126 child_iterator end_children() const; 127 128 symbol_iterator begin_symbols() const; 129 symbol_iterator end_symbols() const; 130 131 // Cast methods. classof(Archive const * v)132 static inline bool classof(Archive const *v) { return true; } classof(Binary const * v)133 static inline bool classof(Binary const *v) { 134 return v->isArchive(); 135 } 136 137 private: 138 child_iterator SymbolTable; 139 child_iterator StringTable; 140 }; 141 142 } 143 } 144 145 #endif 146