//===-- 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 lldb_private::FunctionCallLabel::fromString(llvm::StringRef label) { llvm::SmallVector components; label.split(components, ":", /*MaxSplit=*/4); if (components.size() != 5) 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 discriminator = components[1]; llvm::StringRef module_label = components[2]; llvm::StringRef die_label = components[3]; llvm::StringRef lookup_name = components[4]; 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{/*.discriminator=*/discriminator, /*.module_id=*/module_id, /*.symbol_id=*/die_id, /*.lookup_name=*/lookup_name}; } std::string lldb_private::FunctionCallLabel::toString() const { return llvm::formatv("{0}:{1}:{2:x}:{3:x}:{4}", FunctionCallLabelPrefix, discriminator, module_id, symbol_id, lookup_name) .str(); } void llvm::format_provider::format( const FunctionCallLabel &label, raw_ostream &OS, StringRef Style) { OS << llvm::formatv("FunctionCallLabel{ discriminator: {0}, module_id: " "{1:x}, symbol_id: {2:x}, " "lookup_name: {3} }", label.discriminator, label.module_id, label.symbol_id, label.lookup_name); }