LLVM: include/llvm/Object/Archive.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13#ifndef LLVM_OBJECT_ARCHIVE_H

14#define LLVM_OBJECT_ARCHIVE_H

15

25#include

26#include

27#include

28#include

29#include

30

31namespace llvm {

33

37

39

41protected:

43

44public:

46 virtual std::unique_ptr clone() const = 0;

48

49

55

56

60

61

64

70

71

72

74

76};

77

78template

80public:

83 StringRef getRawAccessMode() const override;

84 StringRef getRawLastModified() const override;

85 StringRef getRawUID() const override;

86 StringRef getRawGID() const override;

87

90

92};

93

103

106public:

109

110 std::unique_ptr clone() const override {

111 return std::make_unique(*this);

112 }

113

115

120};

121

122

137

138

141

142public:

145 std::unique_ptr clone() const override {

146 return std::make_unique(*this);

147 }

148

151

157};

158

160 virtual void anchor();

161

162public:

164 friend Archive;

165 friend AbstractArchiveMemberHeader;

166

167 const Archive *Parent;

168 std::unique_ptr Header;

169

171

173

175

176 public:

177 LLVM_ABI Child(const Archive *Parent, const char *Start, Error *Err);

179

181 : Parent(C.Parent), Data(C.Data), StartOfFile(C.StartOfFile) {

182 if (C.Header)

183 Header = C.Header->clone();

184 }

185

187 Parent = std::move(C.Parent);

188 Header = std::move(C.Header);

189 Data = C.Data;

190 StartOfFile = C.StartOfFile;

191 }

192

194 if (&C == this)

195 return *this;

196

197 Parent = std::move(C.Parent);

198 Header = std::move(C.Header);

199 Data = C.Data;

200 StartOfFile = C.StartOfFile;

201

202 return *this;

203 }

204

206 if (&C == this)

207 return *this;

208

209 Parent = C.Parent;

210 if (C.Header)

211 Header = C.Header->clone();

212 Data = C.Data;

213 StartOfFile = C.StartOfFile;

214

215 return *this;

216 }

217

219 assert(!Parent || !other.Parent || Parent == other.Parent);

220 return Data.begin() == other.Data.begin();

221 }

222

223 const Archive *getParent() const { return Parent; }

225

229

231 return Header->getLastModified();

232 }

233

235 return Header->getRawLastModified();

236 }

237

240

242 return Header->getAccessMode();

243 }

244

245

247

249

253

255

257 getAsBinary(LLVMContext *Context = nullptr) const;

258 };

259

262

263 public:

266

269

271

272

273

274 return C == other.C;

275 }

276

278 return !(*this == other);

279 }

280

282 auto NextChild = C.getNext();

283 if (!NextChild)

284 return NextChild.takeError();

285 C = std::move(*NextChild);

287 }

288 };

289

291

295 uint32_t StringIndex;

296

297 public:

299 : Parent(p), SymbolIndex(symi), StringIndex(stri) {}

300

302 return (Parent == other.Parent) && (SymbolIndex == other.SymbolIndex);

303 }

304

308 LLVM_ABI bool isECSymbol() const;

309 };

310

313

314 public:

316

319

321 return symbol == other.symbol;

322 }

323

325 return !(*this == other);

326 }

327

329 symbol = symbol.getNext();

330 return *this;

331 }

332 };

333

336

337

340

341

343

345

347 bool isThin() const { return IsThin; }

350

351 child_iterator child_begin(Error &Err, bool SkipInternal = true) const;

352 child_iterator child_end() const;

354 bool SkipInternal = true) const {

356 }

357

363

365

366 static bool classof(Binary const *v) { return v->isArchive(); }

367

368

370

371 virtual bool isEmpty() const;

372 bool hasSymbolTable() const;

375 uint32_t getNumberOfSymbols() const;

376 uint32_t getNumberOfECSymbols() const;

378

380 return std::move(ThinBuffers);

381 }

382

383 std::unique_ptr

384 createArchiveMemberHeader(const char *RawHeaderPtr, uint64_t Size,

385 Error *Err) const;

386

387protected:

388 uint64_t getArchiveMagicLen() const;

389 void setFirstRegular(const Child &C);

390

394

395private:

397 uint16_t FirstRegularStartOfFile = -1;

398

399 unsigned Format : 3;

400 unsigned IsThin : 1;

401 mutable std::vector<std::unique_ptr> ThinBuffers;

402};

403

405public:

406

417

424

425public:

430

433};

434

435}

436}

437

438#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static StringRef getName(Value *V)

static std::optional< int32_t > getOffset(ArrayRef< int32_t > Offsets, size_t Idx)

static unsigned getSize(unsigned Kind)

Lightweight error class with error context and mandatory checking.

static ErrorSuccess success()

Create a success value.

Tagged union holding either a T or a Error.

This is an important class for using LLVM in a threaded context.

StringRef - Represent a constant reference to a string, i.e.

Triple - Helper class for working with autoconf configuration names.

A wrapper class for fallible iterators.

A range adaptor for a pair of iterators.

ChildFallibleIterator()

Definition Archive.h:264

Error inc()

Definition Archive.h:281

const Child * operator->() const

Definition Archive.h:267

bool operator==(const ChildFallibleIterator &other) const

Definition Archive.h:270

const Child & operator*() const

Definition Archive.h:268

bool operator!=(const ChildFallibleIterator &other) const

Definition Archive.h:277

ChildFallibleIterator(const Child &C)

Definition Archive.h:265

StringRef getRawLastModified() const

Definition Archive.h:234

bool operator==(const Child &other) const

Definition Archive.h:218

LLVM_ABI uint64_t getChildOffset() const

Child & operator=(const Child &C)

Definition Archive.h:205

Expected< unsigned > getGID() const

Definition Archive.h:239

uint64_t getDataOffset() const

Definition Archive.h:252

Expected< StringRef > getRawName() const

Definition Archive.h:228

Expected< unsigned > getUID() const

Definition Archive.h:238

LLVM_ABI Child(const Archive *Parent, const char *Start, Error *Err)

Child & operator=(Child &&C) noexcept

Definition Archive.h:193

Expected< sys::fs::perms > getAccessMode() const

Definition Archive.h:241

Expected< sys::TimePoint< std::chrono::seconds > > getLastModified() const

Definition Archive.h:230

const Archive * getParent() const

Definition Archive.h:223

Child(Child &&C)

Definition Archive.h:186

Child(const Child &C)

Definition Archive.h:180

Symbol(const Archive *p, uint32_t symi, uint32_t stri)

Definition Archive.h:298

bool operator==(const Symbol &other) const

Definition Archive.h:301

symbol_iterator & operator++()

Definition Archive.h:328

const Symbol & operator*() const

Definition Archive.h:318

bool operator!=(const symbol_iterator &other) const

Definition Archive.h:324

const Symbol * operator->() const

Definition Archive.h:317

symbol_iterator(const Symbol &s)

Definition Archive.h:315

bool operator==(const symbol_iterator &other) const

Definition Archive.h:320

symbol_iterator symbol_begin() const

iterator_range< symbol_iterator > symbols() const

Definition Archive.h:360

virtual uint64_t getFirstChildOffset() const

Definition Archive.h:377

bool isThin() const

Definition Archive.h:347

Archive & operator=(Archive const &)=delete

StringRef getStringTable() const

Definition Archive.h:374

fallible_iterator< ChildFallibleIterator > child_iterator

Definition Archive.h:290

uint64_t getArchiveMagicLen() const

StringRef getSymbolTable() const

Definition Archive.h:373

StringRef ECSymbolTable

Definition Archive.h:392

symbol_iterator symbol_end() const

iterator_range< child_iterator > children(Error &Err, bool SkipInternal=true) const

Definition Archive.h:353

child_iterator child_end() const

Archive(Archive const &)=delete

static bool classof(Binary const *v)

Definition Archive.h:366

StringRef StringTable

Definition Archive.h:393

Archive(MemoryBufferRef Source, Error &Err)

Kind kind() const

Definition Archive.h:346

StringRef SymbolTable

Definition Archive.h:391

Kind

Definition Archive.h:344

@ K_AIXBIG

Definition Archive.h:344

@ K_DARWIN

Definition Archive.h:344

@ K_GNU

Definition Archive.h:344

@ K_BSD

Definition Archive.h:344

@ K_COFF

Definition Archive.h:344

@ K_DARWIN64

Definition Archive.h:344

@ K_GNU64

Definition Archive.h:344

child_iterator child_begin(Error &Err, bool SkipInternal=true) const

static const uint64_t MaxMemberSize

Size field is 10 decimal digits long.

Definition Archive.h:342

std::vector< std::unique_ptr< MemoryBuffer > > takeThinBuffers()

Definition Archive.h:379

bool isEmpty() const override

Definition Archive.h:429

bool Has32BitGlobalSymtab

Definition Archive.h:422

uint64_t getLastChildOffset() const

Definition Archive.h:428

std::string MergedGlobalSymtabBuf

Definition Archive.h:421

bool Has64BitGlobalSymtab

Definition Archive.h:423

const FixLenHdr * ArFixLenHdr

Definition Archive.h:418

uint64_t FirstChildOffset

Definition Archive.h:419

uint64_t LastChildOffset

Definition Archive.h:420

bool has32BitGlobalSymtab()

Definition Archive.h:431

uint64_t getFirstChildOffset() const override

Definition Archive.h:427

bool has64BitGlobalSymtab()

Definition Archive.h:432

LLVM_ABI BigArchive(MemoryBufferRef Source, Error &Err)

Binary(unsigned int Type, MemoryBufferRef Source)

MemoryBufferRef getMemoryBufferRef() const

This provides a very simple, boring adaptor for a begin and end iterator into a range type.

@ C

The default llvm calling convention, compatible with C.

const char ArchiveMagic[]

Definition Archive.h:34

const char ThinArchiveMagic[]

Definition Archive.h:35

const char BigArchiveMagic[]

Definition Archive.h:36

This is an optimization pass for GlobalISel generic memory operations.

iterator_range< T > make_range(T x, T y)

Convenience function for iterating over sub-ranges.

char AccessMode[12]

Definition Archive.h:130

char Terminator[2]

Definition Archive.h:134

char NextOffset[20]

Definition Archive.h:125

char LastModified[12]

Definition Archive.h:127

char PrevOffset[20]

Definition Archive.h:126

char Size[20]

Definition Archive.h:124

char UID[12]

Definition Archive.h:128

char NameLen[4]

Definition Archive.h:131

char GID[12]

Definition Archive.h:129

char Name[2]

Definition Archive.h:133

Fixed-Length Header.

Definition Archive.h:407

char Magic[sizeof(BigArchiveMagic) - 1]

Big archive magic string.

Definition Archive.h:408

char FirstChildOffset[20]

Offset to first archive member.

Definition Archive.h:413

char LastChildOffset[20]

Offset to last archive member.

Definition Archive.h:414

char FreeOffset[20]

Offset to first mem on free list.

Definition Archive.h:415

char GlobSym64Offset[20]

Offset global symbol table for 64-bit objects.

Definition Archive.h:412

char MemOffset[20]

Offset to member table.

Definition Archive.h:409

char GlobSymOffset[20]

Offset to global symbol table.

Definition Archive.h:410

char Terminator[2]

Definition Archive.h:101

char UID[6]

Definition Archive.h:97

char AccessMode[8]

Definition Archive.h:99

char LastModified[12]

Definition Archive.h:96

char GID[6]

Definition Archive.h:98

char Size[10]

Size of data, not including header or padding.

Definition Archive.h:100

char Name[16]

Definition Archive.h:95