forked from bhouse-microsoft/VpuSim
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLlvmObject.cpp
More file actions
126 lines (87 loc) · 2.16 KB
/
LlvmObject.cpp
File metadata and controls
126 lines (87 loc) · 2.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "LlvmObject.h"
#include <windows.h>
using namespace llvm;
using namespace object;
bool VpuObject::LoadSymbolTable(void)
{
for (uint32_t i = 0; i < m_coff->getNumberOfSymbols(); i++)
{
Expected<COFFSymbolRef> symbolOrErr = m_coff->getSymbol(i);
if (!symbolOrErr)
return false;
auto symbol = *symbolOrErr;
StringRef testName;
if (m_coff->getSymbolName(symbol, testName))
return false;
if (m_symbolTable.count(testName) != 0)
return false;
m_symbolTable[testName] = symbol.getValue();
i += symbol.getNumberOfAuxSymbols();
}
return true;
}
bool VpuObject::LoadRelocations(void)
{
for (auto r : m_code.relocations()) {
VpuObjRelocation objrel;
objrel.m_fixupOffset = r.getOffset();
objrel.m_type = r.getType();
auto symbol = r.getSymbol();
Expected<SymbolRef::Type> typeOrErr = symbol->getType();
if (!typeOrErr) return false;
SymbolRef::Type type = *typeOrErr;
Expected<StringRef> nameOrErr = symbol->getName();
if (!nameOrErr) return false;
objrel.m_symbolName = *nameOrErr;
m_relocations.push_back(objrel);
}
return true;
}
bool VpuObject::Open(const char * filePath)
{
StringRef file(filePath);
Expected<OwningBinary<Binary>> binaryOrErr = createBinary(file);
if (!binaryOrErr)
return false;
m_binary = std::move(*binaryOrErr);
Binary * binary = m_binary.getBinary();
m_obj = dyn_cast<ObjectFile>(binary);
if (m_obj == nullptr)
return false;
m_coff = dyn_cast<const COFFObjectFile>(m_obj);
if (m_coff == nullptr)
return false;
if (!LoadSymbolTable())
return false;
for (const SectionRef §ion : m_obj->sections())
{
StringRef name;
if (section.getName(name))
return false;
if (name == ".text") {
m_code = section;
}
}
if (m_code == SectionRef())
return false;
if (!LoadRelocations())
return false;
m_loaded = true;
return true;
}
bool VpuObject::GetCode(uint8_t * buffer, uint64_t size)
{
StringRef contents;
if (m_code.getContents(contents))
return false;
if (contents.size() > size)
return false;
memset(buffer, 0, size);
memcpy(buffer, contents.data(), contents.size());
return true;
}
void VpuObject::Close()
{
m_symbolTable.clear();
m_loaded = false;
}