1//===-- llvm-readobj.h ----------------------------------------------------===//
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#ifndef LLVM_TOOLS_LLVM_READOBJ_LLVM_READOBJ_H
11#define LLVM_TOOLS_LLVM_READOBJ_LLVM_READOBJ_H
12
13#include "llvm/Support/CommandLine.h"
14#include "llvm/Support/Compiler.h"
15#include "llvm/Support/ErrorOr.h"
16#include "llvm/Support/Error.h"
17#include <string>
18
19namespace llvm {
20  namespace object {
21    class RelocationRef;
22  }
23
24  // Various helper functions.
25  LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg);
26  void error(std::error_code ec);
27  template <class T> T unwrapOrError(ErrorOr<T> EO) {
28    if (EO)
29      return *EO;
30    reportError(EO.getError().message());
31  }
32  template <class T> T unwrapOrError(Expected<T> EO) {
33    if (EO)
34      return *EO;
35    std::string Buf;
36    raw_string_ostream OS(Buf);
37    logAllUnhandledErrors(EO.takeError(), OS, "");
38    OS.flush();
39    reportError(Buf);
40  }
41  bool relocAddressLess(object::RelocationRef A,
42                        object::RelocationRef B);
43} // namespace llvm
44
45namespace opts {
46  extern llvm::cl::list<std::string> InputFilenames;
47  extern llvm::cl::opt<bool> FileHeaders;
48  extern llvm::cl::opt<bool> Sections;
49  extern llvm::cl::opt<bool> SectionRelocations;
50  extern llvm::cl::opt<bool> SectionSymbols;
51  extern llvm::cl::opt<bool> SectionData;
52  extern llvm::cl::opt<bool> Relocations;
53  extern llvm::cl::opt<bool> Symbols;
54  extern llvm::cl::opt<bool> DynamicSymbols;
55  extern llvm::cl::opt<bool> UnwindInfo;
56  extern llvm::cl::opt<bool> ExpandRelocs;
57  extern llvm::cl::opt<bool> CodeView;
58  extern llvm::cl::opt<bool> CodeViewSubsectionBytes;
59  extern llvm::cl::opt<bool> ARMAttributes;
60  extern llvm::cl::opt<bool> MipsPLTGOT;
61  enum OutputStyleTy { LLVM, GNU };
62  extern llvm::cl::opt<OutputStyleTy> Output;
63} // namespace opts
64
65#define LLVM_READOBJ_ENUM_ENT(ns, enum) \
66  { #enum, ns::enum }
67
68#define LLVM_READOBJ_ENUM_CLASS_ENT(enum_class, enum) \
69  { #enum, std::underlying_type<enum_class>::type(enum_class::enum) }
70
71#endif
72