@@ -19,7 +19,11 @@ using namespace llvm::object;
19
19
20
20
template <typename T>
21
21
bool has_addresses (const ELFObjectFile<T> &obj) {
22
+ #if LLVM_VERSION_MAJOR >= 12
23
+ auto hdr = &obj.getELFFile ().getHeader ();
24
+ #else
22
25
auto hdr = obj.getELFFile ()->getHeader ();
26
+ #endif
23
27
return (hdr->e_type == ELF::ET_EXEC ||
24
28
hdr->e_type == ELF::ET_DYN ||
25
29
hdr->e_type == ELF::ET_CORE);
@@ -28,7 +32,11 @@ bool has_addresses(const ELFObjectFile<T> &obj) {
28
32
29
33
template <typename T>
30
34
bool is_executable (const ELFObjectFile<T> &obj) {
35
+ #if LLVM_VERSION_MAJOR >= 12
36
+ auto hdr = &obj.getELFFile ().getHeader ();
37
+ #else
31
38
auto hdr = obj.getELFFile ()->getHeader ();
39
+ #endif
32
40
return (hdr->e_type == ELF::ET_EXEC ||
33
41
hdr->e_type == ELF::ET_DYN);
34
42
}
@@ -42,7 +50,11 @@ bool is_executable(const ELFObjectFile<T> &obj) {
42
50
template <typename T>
43
51
uint64_t base_address (const ELFObjectFile<T> &obj) {
44
52
uint64_t base = 0L ;
53
+ #if LLVM_VERSION_MAJOR >= 12
54
+ auto elf = obj.getELFFile ();
55
+ #else
45
56
auto elf = *obj.getELFFile ();
57
+ #endif
46
58
auto segs = prim::elf_program_headers (elf);
47
59
auto code = segs.end ();
48
60
@@ -58,7 +70,12 @@ uint64_t base_address(const ELFObjectFile<T> &obj) {
58
70
template <typename T>
59
71
uint64_t minimal_progbits_offset (const ELFObjectFile<T> &obj) {
60
72
auto smallest = std::numeric_limits<uint64_t >::max ();
61
- for (auto sec : prim::elf_sections (*obj.getELFFile ())) {
73
+ #if LLVM_VERSION_MAJOR >= 12
74
+ auto &elf_file = obj.getELFFile ();
75
+ #else
76
+ auto &elf_file = *obj.getELFFile ();
77
+ #endif
78
+ for (auto sec : prim::elf_sections (elf_file)) {
62
79
if (sec.sh_type == ELF::SHT_PROGBITS && sec.sh_offset < smallest) {
63
80
smallest = sec.sh_offset ;
64
81
}
@@ -68,7 +85,11 @@ uint64_t minimal_progbits_offset(const ELFObjectFile<T> &obj) {
68
85
69
86
template <typename T>
70
87
void emit_entry_point (const ELFObjectFile<T> &obj, ogre_doc &s) {
88
+ #if LLVM_VERSION_MAJOR >= 12
89
+ auto hdr = &obj.getELFFile ().getHeader ();
90
+ #else
71
91
auto hdr = obj.getELFFile ()->getHeader ();
92
+ #endif
72
93
s.entry (" llvm:entry-point" ) << hdr->e_entry ;
73
94
}
74
95
@@ -80,7 +101,11 @@ std::string name_of_index(std::size_t i) {
80
101
81
102
template <typename T>
82
103
void emit_program_headers (const ELFObjectFile<T> &obj, ogre_doc &s) {
104
+ #if LLVM_VERSION_MAJOR >= 12
105
+ auto hdrs = prim::elf_program_headers (obj.getELFFile ());
106
+ #else
83
107
auto hdrs = prim::elf_program_headers (*obj.getELFFile ());
108
+ #endif
84
109
for (auto it = hdrs.begin (); it != hdrs.end (); ++it) {
85
110
bool ld = (it->p_type == ELF::PT_LOAD);
86
111
bool r = static_cast <bool >(it->p_flags & ELF::PF_R);
@@ -162,7 +187,14 @@ bool is_external(uint64_t addr, uint64_t offset, uint64_t size) {
162
187
163
188
template <typename T>
164
189
void emit_symbol_entry (const ELFObjectFile<T> &obj, const SymbolRef &sym, ogre_doc &s) {
190
+ #if LLVM_VERSION_MAJOR >= 12
191
+ auto sym_elf_or_error = obj.getSymbol (sym.getRawDataRefImpl ());
192
+ if (!sym_elf_or_error)
193
+ return ;
194
+ auto sym_elf = *sym_elf_or_error;
195
+ #else
165
196
auto sym_elf = obj.getSymbol (sym.getRawDataRefImpl ());
197
+ #endif
166
198
auto name = prim::symbol_name (sym);
167
199
auto addr = prim::symbol_address (sym);
168
200
auto off = symbol_file_offset (obj, sym);
@@ -188,7 +220,11 @@ void emit_symbol_entries(const ELFObjectFile<T> &obj, symbol_iterator begin, sym
188
220
189
221
template <typename T>
190
222
void emit_symbol_entries (const ELFObjectFile<T> &obj, ogre_doc &s) {
223
+ #if LLVM_VERSION_MAJOR >= 12
224
+ auto elf = &obj.getELFFile ();
225
+ #else
191
226
auto elf = obj.getELFFile ();
227
+ #endif
192
228
emit_symbol_entries (obj, obj.symbol_begin (), obj.symbol_end (), s);
193
229
auto secs = prim::elf_sections (*elf);
194
230
emit_symbol_entries (obj, obj.dynamic_symbol_begin (), obj.dynamic_symbol_end (), s);
0 commit comments