diff options
author | Zachary Turner <zturner@google.com> | 2016-11-08 04:52:16 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-11-08 04:52:16 +0000 |
commit | c5d7df90356b1b3d1e384220e34ba5cb87583829 (patch) | |
tree | 8ebeb702da0ed90c6e328c1d1336a3724a409742 /lldb/source/Interpreter/Args.cpp | |
parent | 77c89b6958f51a0b26c4849d37a200c1bc0319df (diff) | |
download | bcm5719-llvm-c5d7df90356b1b3d1e384220e34ba5cb87583829.tar.gz bcm5719-llvm-c5d7df90356b1b3d1e384220e34ba5cb87583829.zip |
Convert some Expression parser functions to StringRef.
llvm-svn: 286208
Diffstat (limited to 'lldb/source/Interpreter/Args.cpp')
-rw-r--r-- | lldb/source/Interpreter/Args.cpp | 180 |
1 files changed, 94 insertions, 86 deletions
diff --git a/lldb/source/Interpreter/Args.cpp b/lldb/source/Interpreter/Args.cpp index 6653fbb6e5a..a0a300affdd 100644 --- a/lldb/source/Interpreter/Args.cpp +++ b/lldb/source/Interpreter/Args.cpp @@ -550,106 +550,114 @@ void Args::Clear() { } lldb::addr_t Args::StringToAddress(const ExecutionContext *exe_ctx, - const char *s, lldb::addr_t fail_value, + llvm::StringRef s, lldb::addr_t fail_value, Error *error_ptr) { bool error_set = false; - if (s && s[0]) { - llvm::StringRef sref = s; + if (s.empty()) { + if (error_ptr) + error_ptr->SetErrorStringWithFormat("invalid address expression \"%s\"", + s.str().c_str()); + return fail_value; + } - char *end = nullptr; - lldb::addr_t addr = ::strtoull(s, &end, 0); - if (*end == '\0') { - if (error_ptr) - error_ptr->Clear(); - return addr; // All characters were used, return the result - } - // Try base 16 with no prefix... - addr = ::strtoull(s, &end, 16); - if (*end == '\0') { + llvm::StringRef sref = s; + + lldb::addr_t addr = LLDB_INVALID_ADDRESS; + if (!s.getAsInteger(0, addr)) { + if (error_ptr) + error_ptr->Clear(); + return addr; + } + + // Try base 16 with no prefix... + if (!s.getAsInteger(16, addr)) { + if (error_ptr) + error_ptr->Clear(); + return addr; + } + + Target *target = nullptr; + if (!exe_ctx || !(target = exe_ctx->GetTargetPtr())) { + if (error_ptr) + error_ptr->SetErrorStringWithFormat("invalid address expression \"%s\"", + s.str().c_str()); + return fail_value; + } + + lldb::ValueObjectSP valobj_sp; + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(false); + options.SetTryAllThreads(true); + + ExpressionResults expr_result = + target->EvaluateExpression(s, exe_ctx->GetFramePtr(), valobj_sp, options); + + bool success = false; + if (expr_result == eExpressionCompleted) { + if (valobj_sp) + valobj_sp = valobj_sp->GetQualifiedRepresentationIfAvailable( + valobj_sp->GetDynamicValueType(), true); + // Get the address to watch. + if (valobj_sp) + addr = valobj_sp->GetValueAsUnsigned(fail_value, &success); + if (success) { if (error_ptr) error_ptr->Clear(); - return addr; // All characters were used, return the result + return addr; + } else { + if (error_ptr) { + error_set = true; + error_ptr->SetErrorStringWithFormat( + "address expression \"%s\" resulted in a value whose type " + "can't be converted to an address: %s", + s, valobj_sp->GetTypeName().GetCString()); + } } - if (exe_ctx) { - Target *target = exe_ctx->GetTargetPtr(); - if (target) { - lldb::ValueObjectSP valobj_sp; - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(false); - options.SetTryAllThreads(true); - - ExpressionResults expr_result = target->EvaluateExpression( - s, exe_ctx->GetFramePtr(), valobj_sp, options); - - bool success = false; - if (expr_result == eExpressionCompleted) { - if (valobj_sp) - valobj_sp = valobj_sp->GetQualifiedRepresentationIfAvailable( - valobj_sp->GetDynamicValueType(), true); - // Get the address to watch. - if (valobj_sp) - addr = valobj_sp->GetValueAsUnsigned(fail_value, &success); - if (success) { - if (error_ptr) - error_ptr->Clear(); - return addr; - } else { - if (error_ptr) { - error_set = true; - error_ptr->SetErrorStringWithFormat( - "address expression \"%s\" resulted in a value whose type " - "can't be converted to an address: %s", - s, valobj_sp->GetTypeName().GetCString()); - } - } - - } else { - // Since the compiler can't handle things like "main + 12" we should - // try to do this for now. The compiler doesn't like adding offsets - // to function pointer types. - static RegularExpression g_symbol_plus_offset_regex(llvm::StringRef( - "^(.*)([-\\+])[[:space:]]*(0x[0-9A-Fa-f]+|[0-9]+)[[:space:]]*$")); - RegularExpression::Match regex_match(3); - if (g_symbol_plus_offset_regex.Execute(sref, ®ex_match)) { - uint64_t offset = 0; - bool add = true; - std::string name; - std::string str; - if (regex_match.GetMatchAtIndex(s, 1, name)) { - if (regex_match.GetMatchAtIndex(s, 2, str)) { - add = str[0] == '+'; - - if (regex_match.GetMatchAtIndex(s, 3, str)) { - offset = StringConvert::ToUInt64(str.c_str(), 0, 0, &success); - - if (success) { - Error error; - addr = StringToAddress(exe_ctx, name.c_str(), - LLDB_INVALID_ADDRESS, &error); - if (addr != LLDB_INVALID_ADDRESS) { - if (add) - return addr + offset; - else - return addr - offset; - } - } - } + } else { + // Since the compiler can't handle things like "main + 12" we should + // try to do this for now. The compiler doesn't like adding offsets + // to function pointer types. + static RegularExpression g_symbol_plus_offset_regex( + "^(.*)([-\\+])[[:space:]]*(0x[0-9A-Fa-f]+|[0-9]+)[[:space:]]*$"); + RegularExpression::Match regex_match(3); + if (g_symbol_plus_offset_regex.Execute(sref, ®ex_match)) { + uint64_t offset = 0; + bool add = true; + std::string name; + std::string str; + if (regex_match.GetMatchAtIndex(s, 1, name)) { + if (regex_match.GetMatchAtIndex(s, 2, str)) { + add = str[0] == '+'; + + if (regex_match.GetMatchAtIndex(s, 3, str)) { + offset = StringConvert::ToUInt64(str.c_str(), 0, 0, &success); + + if (success) { + Error error; + addr = StringToAddress(exe_ctx, name.c_str(), + LLDB_INVALID_ADDRESS, &error); + if (addr != LLDB_INVALID_ADDRESS) { + if (add) + return addr + offset; + else + return addr - offset; } } } - - if (error_ptr) { - error_set = true; - error_ptr->SetErrorStringWithFormat( - "address expression \"%s\" evaluation failed", s); - } } } } + + if (error_ptr) { + error_set = true; + error_ptr->SetErrorStringWithFormat( + "address expression \"%s\" evaluation failed", s); + } } + if (error_ptr) { if (!error_set) error_ptr->SetErrorStringWithFormat("invalid address expression \"%s\"", |