@@ -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+
3448static 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