Skip to content

Commit 42b0a84

Browse files
committed
src: load symbols from shared lib
PR-URL: #154 Fixes: #153 Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
1 parent ea0aae7 commit 42b0a84

1 file changed

Lines changed: 21 additions & 18 deletions

File tree

src/llv8-constants.cc

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,27 @@ void Module::Assign(SBTarget target, Common* common) {
3131
}
3232

3333

34+
template <typename T>
35+
T ReadSymbolFromTarget(SBTarget& target, SBAddress& start,
36+
const char* name, Error& err) {
37+
SBError sberr;
38+
T res = 0;
39+
target.ReadMemory(start, &res, sizeof(T), sberr);
40+
if (!sberr.Fail()) {
41+
err = Error::Ok();
42+
} else {
43+
err = Error::Failure("Failed to read symbol %s", name);
44+
}
45+
return res;
46+
}
47+
3448
static int64_t LookupConstant(SBTarget target, const char* name, int64_t def,
3549
Error& err) {
36-
int64_t res;
37-
50+
int64_t res = 0;
3851
res = def;
3952

4053
SBSymbolContextList context_list = target.FindSymbols(name);
54+
4155
if (!context_list.IsValid() || context_list.GetSize() == 0) {
4256
err = Error::Failure("Failed to find symbol %s", name);
4357
return res;
@@ -46,42 +60,31 @@ static int64_t LookupConstant(SBTarget target, const char* name, int64_t def,
4660
SBSymbolContext context = context_list.GetContextAtIndex(0);
4761
SBSymbol symbol = context.GetSymbol();
4862
if (!symbol.IsValid()) {
49-
err = Error::Failure("Failed to fetch symbol %s", name);
63+
err = Error::Failure("Failed to fetch symbol %s from context", name);
5064
return res;
5165
}
5266

5367
SBAddress start = symbol.GetStartAddress();
5468
SBAddress end = symbol.GetEndAddress();
5569
uint32_t size = end.GetOffset() - start.GetOffset();
5670

57-
SBError sberr;
58-
59-
SBProcess process = target.GetProcess();
60-
addr_t addr = start.GetFileAddress();
61-
6271
// NOTE: size could be bigger for at the end symbols
6372
if (size >= 8) {
64-
res = process.ReadUnsignedFromMemory(addr, 8, sberr);
73+
res = ReadSymbolFromTarget<int64_t>(target, start, name, err);
6574
} else if (size == 4) {
66-
int32_t tmp = process.ReadUnsignedFromMemory(addr, size, sberr);
75+
int32_t tmp = ReadSymbolFromTarget<int32_t>(target, start, name, err);
6776
res = static_cast<int64_t>(tmp);
6877
} else if (size == 2) {
69-
int16_t tmp = process.ReadUnsignedFromMemory(addr, size, sberr);
78+
int16_t tmp = ReadSymbolFromTarget<int16_t>(target, start, name, err);
7079
res = static_cast<int64_t>(tmp);
7180
} else if (size == 1) {
72-
int8_t tmp = process.ReadUnsignedFromMemory(addr, size, sberr);
81+
int8_t tmp = ReadSymbolFromTarget<int8_t>(target, start, name, err);
7382
res = static_cast<int64_t>(tmp);
7483
} else {
7584
err = Error::Failure("Unexpected symbol size %" PRIu32 " of symbol %s",
7685
size, name);
77-
return res;
7886
}
7987

80-
if (sberr.Fail())
81-
err = Error::Failure("Failed to load symbol %s", name);
82-
else
83-
err = Error::Ok();
84-
8588
return res;
8689
}
8790

0 commit comments

Comments
 (0)