| //===-- Expression.cpp ----------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lldb/Expression/Expression.h" |
| #include "lldb/Target/ExecutionContextScope.h" |
| #include "lldb/Target/Target.h" |
| |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/ADT/StringExtras.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Support/Error.h" |
| |
| using namespace lldb_private; |
| |
| Expression::Expression(Target &target) |
| : m_target_wp(target.shared_from_this()), |
| m_jit_start_addr(LLDB_INVALID_ADDRESS), |
| m_jit_end_addr(LLDB_INVALID_ADDRESS) { |
| // Can't make any kind of expression without a target. |
| assert(m_target_wp.lock()); |
| } |
| |
| Expression::Expression(ExecutionContextScope &exe_scope) |
| : m_target_wp(exe_scope.CalculateTarget()), |
| m_jit_start_addr(LLDB_INVALID_ADDRESS), |
| m_jit_end_addr(LLDB_INVALID_ADDRESS) { |
| assert(m_target_wp.lock()); |
| } |
| |
| llvm::Expected<FunctionCallLabel> |
| lldb_private::FunctionCallLabel::fromString(llvm::StringRef label) { |
| llvm::SmallVector<llvm::StringRef, 4> components; |
| label.split(components, ":", /*MaxSplit=*/3); |
| |
| if (components.size() != 4) |
| return llvm::createStringError("malformed function call label."); |
| |
| if (components[0] != FunctionCallLabelPrefix) |
| return llvm::createStringError(llvm::formatv( |
| "expected function call label prefix '{0}' but found '{1}' instead.", |
| FunctionCallLabelPrefix, components[0])); |
| |
| llvm::StringRef module_label = components[1]; |
| llvm::StringRef die_label = components[2]; |
| |
| lldb::user_id_t module_id = 0; |
| if (!llvm::to_integer(module_label, module_id)) |
| return llvm::createStringError( |
| llvm::formatv("failed to parse module ID from '{0}'.", module_label)); |
| |
| lldb::user_id_t die_id; |
| if (!llvm::to_integer(die_label, die_id)) |
| return llvm::createStringError( |
| llvm::formatv("failed to parse symbol ID from '{0}'.", die_label)); |
| |
| return FunctionCallLabel{/*.module_id=*/module_id, |
| /*.symbol_id=*/die_id, |
| /*.lookup_name=*/components[3]}; |
| } |
| |
| std::string lldb_private::FunctionCallLabel::toString() const { |
| return llvm::formatv("{0}:{1:x}:{2:x}:{3}", FunctionCallLabelPrefix, |
| module_id, symbol_id, lookup_name) |
| .str(); |
| } |
| |
| void llvm::format_provider<FunctionCallLabel>::format( |
| const FunctionCallLabel &label, raw_ostream &OS, StringRef Style) { |
| OS << llvm::formatv("FunctionCallLabel{ module_id: {0:x}, symbol_id: {1:x}, " |
| "lookup_name: {2} }", |
| label.module_id, label.symbol_id, label.lookup_name); |
| } |