24#include "llvm/Support/ErrorExtras.h"
25#include "llvm/Support/FormatAdapters.h"
34 return type_system.get()->GetBasicTypeFromAST(basic_type);
41 llvm::StringRef name) {
51static llvm::Expected<SymbolContext>
55 return llvm::createStringError(
"no stack frame in execution context");
58 lldb::eSymbolContextCompUnit | lldb::eSymbolContextModule);
60 return llvm::createStringErrorV(
"no compile unit for frame: {0}",
61 frame_sp->GetFunctionName());
63 return llvm::createStringErrorV(
"no module for frame: {0}",
64 frame_sp->GetFunctionName());
65 return symbol_context;
69 llvm::Expected<SymbolContext> symbol_context =
72 return symbol_context.takeError();
74 return symbol_context->comp_unit->GetLanguage();
79 if (
auto frame_sp =
m_exe_ctx.GetFrameSP()) {
81 frame_sp->GetSymbolContext(lldb::eSymbolContextCompUnit);
84 symbol_context = frame_sp->GetSymbolContext(lldb::eSymbolContextModule);
86 return symbol_context.
module_sp->GetTypeSystemForLanguage(language);
92 return llvm::createStringError(
"no target for frame");
94 language = target_sp->GetLanguage().AsLanguageType();
95 return target_sp->GetScratchTypeSystemForLanguage(language);
103 std::string name_storage =
105 llvm::StringRef name = name_storage;
106 if (name.consume_front(
"$"))
113 const auto &member =
static_cast<const MemberOfNode &
>(node);
114 if (member.GetIsArrow())
119 return *base_name +
"." + member.GetFieldName().str();
122llvm::Expected<lldb::ValueObjectSP>
125 return llvm::make_error<DILDiagnosticError>(
m_expr,
"invalid value object",
129 return type_system.takeError();
132 if (valobj->IsBitfield()) {
137 uint32_t bitfield_size = valobj->GetBitfieldBitSize();
140 if (bitfield_size > 0 && in_type.
IsInteger()) {
144 llvm::Expected<uint64_t> int_bit_size =
147 return int_bit_size.takeError();
148 llvm::Expected<uint64_t> uint_bit_size =
151 return uint_bit_size.takeError();
152 if (bitfield_size < *int_bit_size ||
153 (in_type.
IsSigned() && bitfield_size == *int_bit_size)) {
154 auto result = valobj->CastToBasicType(int_type);
155 if (result->GetError().Fail())
156 return llvm::make_error<DILDiagnosticError>(
157 m_expr, result->GetError().AsCString(), location);
160 if (bitfield_size <= *uint_bit_size) {
161 auto result = valobj->CastToBasicType(uint_type);
162 if (result->GetError().Fail())
163 return llvm::make_error<DILDiagnosticError>(
164 m_expr, result->GetError().AsCString(), location);
169 bool resolved = valobj->ResolveValue(scalar);
171 return llvm::createStringError(
"invalid scalar value");
181 valobj->GetCompilerType().GetPromotedIntegerType();
183 auto result = valobj->CastToBasicType(promoted_type);
184 if (result->GetError().Fail())
185 return llvm::make_error<DILDiagnosticError>(
186 m_expr, result->GetError().AsCString(), location);
233 switch (basic_type) {
252llvm::Expected<CompilerType>
257 llvm::Expected<uint64_t> lhs_size =
260 return lhs_size.takeError();
261 llvm::Expected<uint64_t> rhs_size =
264 return rhs_size.takeError();
266 if (*rhs_size == *lhs_size) {
269 return type_system.takeError();
274 return r_type_unsigned;
280llvm::Expected<CompilerType>
286 return lhs_or_err.takeError();
290 return rhs_or_err.takeError();
306 if (l_rank == 0 || r_rank == 0)
307 return llvm::make_error<DILDiagnosticError>(
308 m_expr,
"unexpected basic type in arithmetic operation", location);
313 using Rank = std::tuple<size_t, bool>;
314 Rank int_l_rank = {l_rank, !lhs_type.
IsSigned()};
315 Rank int_r_rank = {r_rank, !rhs_type.
IsSigned()};
316 if (int_l_rank < int_r_rank) {
319 return type_or_err.takeError();
322 if (int_l_rank > int_r_rank) {
325 return type_or_err.takeError();
340 std::vector<lldb::VariableSP> possible_matches;
343 llvm::StringRef str_ref_name = var_sp->GetName().GetStringRef();
345 str_ref_name.consume_front(
"::");
351 if (var_sp->NameMatches(name))
352 possible_matches.push_back(var_sp);
356 if (possible_matches.size() > 0)
357 return possible_matches[0];
370 frame_sp->GetSymbolContext(lldb::eSymbolContextCompUnit);
375 name_ref.consume_front(
"::");
381 value_sp = frame_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic);
392 target_sp->GetImages().FindGlobalVariables(
393 ConstString(name_ref), std::numeric_limits<uint32_t>::max(),
396 if (!modules_var_list.
Empty()) {
416 if (name_ref.starts_with(
"$")) {
418 target_sp->GetPersistentExpressionStateForLanguage(language))
419 if (
auto var_sp = state->GetVariable(name_ref))
420 if (
auto valobj_sp = var_sp->GetValueObject())
434 if (name_ref.consume_front(
"$")) {
439 if (
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(name_ref))
446 if (!name_ref.contains(
"::")) {
454 variable_list->FindVariable(
ConstString(name_ref));
457 frame_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic);
464 SymbolContext sc = frame_sp->GetSymbolContext(lldb::eSymbolContextFunction |
465 lldb::eSymbolContextBlock);
467 value_sp = frame_sp->FindVariable(
ConstString(instance_name));
469 value_sp = value_sp->GetChildMemberWithName(name_ref);
479 if (name_ref.contains(
"::")) {
480 llvm::StringRef enum_typename, enumerator_name;
483 std::tie(enum_typename, enumerator_name) = name_ref.rsplit(
"::");
488 const llvm::APSInt &value) ->
bool {
489 if (name == enumerator_name) {
492 enum_type,
"result");
506 const bool check_ptr_vs_member =
508 const bool no_synth_child =
510 const bool allow_var_updates =
512 const bool disallow_globals =
521llvm::Expected<lldb::ValueObjectSP>
523 assert(tree &&
"ASTNodeUP must not contain a nullptr");
526 if (!value_or_error) {
527 auto error = value_or_error.takeError();
529 "[Interpreter::Evaluate] DIL interpreter failed:\n{0}",
530 llvm::toStringWithoutConsuming(
error));
534 return value_or_error;
539 auto value_or_error = node.
Accept(
this);
541 if (value_or_error && !*value_or_error)
542 return llvm::make_error<DILDiagnosticError>(
m_expr,
"invalid value object",
546 return value_or_error;
549llvm::Expected<lldb::ValueObjectSP>
551 auto valobj_or_err =
Evaluate(node);
553 return valobj_or_err;
557 if (valobj->GetCompilerType().IsReferenceType()) {
558 valobj = valobj->Dereference(
error);
560 return error.ToError();
565llvm::Expected<lldb::ValueObjectSP>
578 if (!identifier && node.
GetName()[0] ==
'$') {
585 llvm::consumeError(language.takeError());
588 if (!identifier && node.
GetName() ==
"nullptr") {
593 return type_system.takeError();
594 llvm::APInt value(type_system.get()->GetPointerByteSize() * CHAR_BIT, 0);
603 llvm::formatv(
"use of undeclared identifier '{0}'", node.
GetName());
604 return llvm::make_error<DILDiagnosticError>(
611llvm::Expected<lldb::ValueObjectSP>
624 operand = dynamic_op;
630 child_sp = synth_obj_sp->Dereference(
error);
634 return llvm::make_error<DILDiagnosticError>(
m_expr,
error.AsCString(),
643 return llvm::make_error<DILDiagnosticError>(
m_expr,
error.AsCString(),
649 if (operand->GetCompilerType().IsReferenceType()) {
650 operand = operand->Dereference(
error);
652 return error.ToError();
654 llvm::Expected<lldb::ValueObjectSP> conv_op =
662 llvm::formatv(
"invalid argument type '{0}' to unary expression",
664 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
668 bool resolved = operand->ResolveValue(scalar);
675 m_exe_ctx, scalar, operand->GetCompilerType(),
"result");
679 if (operand->GetCompilerType().IsReferenceType()) {
680 operand = operand->Dereference(
error);
682 return error.ToError();
684 llvm::Expected<lldb::ValueObjectSP> conv_op =
694 llvm::formatv(
"invalid argument type '{0}' to unary expression",
696 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
702 if (operand->GetCompilerType().IsReferenceType()) {
703 operand = operand->Dereference(
error);
705 return error.ToError();
707 llvm::Expected<lldb::ValueObjectSP> conv_op =
715 llvm::formatv(
"invalid argument type '{0}' to unary expression",
717 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
721 bool resolved = operand->ResolveValue(scalar);
723 std::string errMsg = llvm::formatv(
"invalid operand value: {0}",
724 operand->GetError().AsCString());
725 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
732 m_exe_ctx, scalar, operand->GetCompilerType(),
"result");
736 if (operand->GetCompilerType().IsReferenceType()) {
737 operand = operand->Dereference(
error);
739 return error.ToError();
744 llvm::formatv(
"invalid argument type '{0}' to unary expression",
746 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
751 return type_system.takeError();
752 auto value_or_err = operand->GetValueAsBool();
754 return value_or_err.takeError();
756 !(*value_or_err),
"result");
759 return llvm::make_error<DILDiagnosticError>(
m_expr,
"invalid unary operation",
763llvm::Expected<lldb::ValueObjectSP>
767 if (ptr->GetCompilerType().IsPointerToVoid())
768 return llvm::make_error<DILDiagnosticError>(
769 m_expr,
"arithmetic on a pointer to void", location);
770 if (ptr->GetValueAsUnsigned(0) == 0 && offset != 0)
771 return llvm::make_error<DILDiagnosticError>(
772 m_expr,
"arithmetic on a nullptr is undefined", location);
775 int64_t offset_int = offset->GetValueAsSigned(0, &success);
777 std::string errMsg = llvm::formatv(
"could not get the offset: {0}",
778 offset->GetError().AsCString());
779 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
783 llvm::Expected<uint64_t> byte_size =
784 ptr->GetCompilerType().GetPointeeType().GetByteSize(
785 m_exe_ctx.GetBestExecutionContextScope());
787 return byte_size.takeError();
788 uint64_t ptr_addr = ptr->GetValueAsUnsigned(0);
790 ptr_addr -= offset_int * (*byte_size);
792 ptr_addr += offset_int * (*byte_size);
796 m_exe_ctx, scalar, ptr->GetCompilerType(),
"result");
799llvm::Expected<lldb::ValueObjectSP>
804 bool l_resolved = lhs->ResolveValue(
l);
807 llvm::formatv(
"invalid lhs value: {0}", lhs->GetError().AsCString());
808 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
810 bool r_resolved = rhs->ResolveValue(r);
813 llvm::formatv(
"invalid rhs value: {0}", rhs->GetError().AsCString());
814 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
817 auto value_object = [
this, result_type](
Scalar scalar) {
819 result_type,
"result");
824 return value_object(
l + r);
826 return value_object(
l - r);
828 return value_object(
l * r);
830 return value_object(
l / r);
832 return value_object(
l % r);
834 return value_object(
l & r);
836 return value_object(
l ^ r);
838 return value_object(
l | r);
840 return value_object(
l << r);
842 return value_object(
l >> r);
844 return value_object(
l < r);
846 return value_object(
l > r);
848 return value_object(
l <= r);
850 return value_object(
l >= r);
852 return value_object(
l == r);
854 return value_object(
l != r);
858 return llvm::make_error<DILDiagnosticError>(
859 m_expr,
"invalid arithmetic operation", location);
868 auto orig_lhs_type = lhs->GetCompilerType();
869 auto orig_rhs_type = rhs->GetCompilerType();
872 return type_or_err.takeError();
881 if (lhs->GetCompilerType().IsPointerType()) {
884 }
else if (rhs->GetCompilerType().IsPointerType()) {
889 if (!ptr || !offset->GetCompilerType().IsInteger()) {
891 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
892 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
893 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
906 auto orig_lhs_type = lhs->GetCompilerType();
907 auto orig_rhs_type = rhs->GetCompilerType();
910 return type_or_err.takeError();
916 auto lhs_type = lhs->GetCompilerType();
917 auto rhs_type = rhs->GetCompilerType();
920 if (lhs_type.IsPointerType() && rhs_type.IsInteger())
924 if (lhs_type.IsPointerType() && rhs_type.IsPointerType()) {
925 if (lhs_type.IsPointerToVoid() && rhs_type.IsPointerToVoid()) {
926 return llvm::make_error<DILDiagnosticError>(
927 m_expr,
"arithmetic on pointers to void", location);
932 if (!lhs_unqualified_type.
CompareTypes(rhs_unqualified_type)) {
933 std::string errMsg = llvm::formatv(
934 "'{0}' and '{1}' are not pointers to compatible types",
935 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
936 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
939 llvm::Expected<uint64_t> lhs_byte_size =
941 m_exe_ctx.GetBestExecutionContextScope());
943 return lhs_byte_size.takeError();
945 int64_t item_size = *lhs_byte_size;
946 int64_t diff =
static_cast<int64_t
>(lhs->GetValueAsUnsigned(0) -
947 rhs->GetValueAsUnsigned(0));
948 assert(item_size > 0 &&
"Pointee size cannot be 0");
949 if (diff % item_size != 0) {
952 return llvm::make_error<DILDiagnosticError>(
953 m_expr,
"undefined pointer arithmetic", location);
959 return type_system.takeError();
960 CompilerType ptrdiff_type = type_system.get()->GetPointerDiffType(
true);
962 return llvm::make_error<DILDiagnosticError>(
963 m_expr,
"unable to determine pointer diff type", location);
967 ptrdiff_type,
"result");
971 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
972 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
973 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
981 auto orig_lhs_type = lhs->GetCompilerType();
982 auto orig_rhs_type = rhs->GetCompilerType();
985 return type_or_err.takeError();
990 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
991 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
992 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
1003 auto orig_lhs_type = lhs->GetCompilerType();
1004 auto orig_rhs_type = rhs->GetCompilerType();
1007 return type_or_err.takeError();
1011 std::string errMsg =
1012 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
1013 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
1014 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
1019 if (result_type.
IsInteger() && rhs->GetValueAsSigned(-1) == 0) {
1020 return llvm::make_error<DILDiagnosticError>(
1021 m_expr,
"division by zero is undefined", location);
1031 auto orig_lhs_type = lhs->GetCompilerType();
1032 auto orig_rhs_type = rhs->GetCompilerType();
1035 return type_or_err.takeError();
1039 std::string errMsg =
1040 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
1041 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
1042 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
1046 if (rhs->GetValueAsSigned(-1) == 0) {
1047 return llvm::make_error<DILDiagnosticError>(
1048 m_expr,
"division by zero is undefined", location);
1064 return llvm::createStringError(
1065 "Illegal type for lhs of assignment (not scalar numeric type)");
1070 return llvm::createStringError(
1071 "Illegal type for rhs of assignment (not scalar numeric type)");
1076 return llvm::createStringError(
1077 "Invalid assignment: Can only assign pointers to pointers");
1082 lhs_type != rhs_type) {
1083 std::string err_msg =
1084 llvm::formatv(
"Incompatible types for assignment: Cannot assign {0} "
1087 return llvm::createStringError(err_msg);
1093llvm::Expected<lldb::ValueObjectSP>
1098 if (llvm::Error err = lhs->CanSetValue())
1104 return all_ok.takeError();
1113 bool is_zero = val->GetValueAsUnsigned(-1) == 0;
1114 bool is_boolean = val->GetCompilerType().IsBoolean();
1115 return is_zero && !is_boolean && is_literal;
1121 bool rhs_is_literal, uint32_t location) {
1122 auto orig_lhs_type = lhs->GetCompilerType();
1123 auto orig_rhs_type = rhs->GetCompilerType();
1127 bool lhs_nullptr_or_zero =
1128 orig_lhs_type.IsNullPtrType() ||
IsLiteralZero(lhs, lhs_is_literal);
1129 bool rhs_nullptr_or_zero =
1130 orig_rhs_type.IsNullPtrType() ||
IsLiteralZero(rhs, rhs_is_literal);
1132 if (orig_lhs_type.IsArrayType())
1134 if (orig_rhs_type.IsArrayType())
1140 if (lhs_type == rhs_type)
1141 return llvm::Error::success();
1151 lhs_child = lhs->GetChildAtIndex(0);
1152 if (lhs_child && (lhs_child->IsPointerType() ||
1153 lhs_child->GetCompilerType().IsNullPtrType()))
1154 lhs_type = lhs_child->GetCompilerType();
1160 rhs_child = rhs->GetChildAtIndex(0);
1161 if (rhs_child && (rhs_child->IsPointerType() ||
1162 rhs_child->GetCompilerType().IsNullPtrType()))
1163 rhs_type = rhs_child->GetCompilerType();
1166 if ((lhs_type != orig_lhs_type) || (rhs_type != orig_rhs_type)) {
1168 return llvm::Error::success();
1172 return llvm::Error::success();
1180 return llvm::Error::success();
1184 bool comparable = lhs_unqualified.
CompareTypes(rhs_unqualified);
1186 return llvm::Error::success();
1188 std::string errMsg = llvm::formatv(
1189 "comparison of distinct pointer types ({0} and {1})",
1190 orig_lhs_type.TypeDescription(), orig_rhs_type.TypeDescription());
1191 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
1194 if (!is_ordered && ((orig_lhs_type.IsNullPtrType() && rhs_nullptr_or_zero) ||
1195 (lhs_nullptr_or_zero && orig_rhs_type.IsNullPtrType())))
1196 return llvm::Error::success();
1203 return type_or_err.takeError();
1205 lhs_type = lhs->GetCompilerType();
1206 rhs_type = rhs->GetCompilerType();
1209 return llvm::Error::success();
1215 return llvm::Error::success();
1216 std::string errMsg = llvm::formatv(
1217 "invalid operands to binary expression ({0} and {1})",
1218 orig_lhs_type.TypeDescription(), orig_rhs_type.TypeDescription());
1219 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
1228 return t.IsPointerType() || t.IsInteger() ||
1229 t.IsUnscopedEnumerationType() || (!is_ordered && t.IsNullPtrType());
1232 if ((lhs_type.
IsPointerType() && comparable_to_pointer(rhs_type)) ||
1233 (comparable_to_pointer(lhs_type) && rhs_type.
IsPointerType())) {
1242 bool comparable = lhs_unqualified_type.
CompareTypes(rhs_unqualified_type);
1246 std::string errMsg = llvm::formatv(
1247 "comparison of distinct pointer types ({0} and {1})",
1248 orig_lhs_type.TypeDescription(), orig_rhs_type.TypeDescription());
1249 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
1253 return llvm::Error::success();
1256 std::string errMsg = llvm::formatv(
1257 "invalid operands to binary expression ({0} and {1})",
1258 orig_lhs_type.TypeDescription(), orig_rhs_type.TypeDescription());
1259 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
1262llvm::Expected<lldb::ValueObjectSP>
1265 bool rhs_is_literal, uint32_t location) {
1275 rhs_is_literal, location))
1280 return type_system.takeError();
1286llvm::Expected<lldb::ValueObjectSP>
1291 auto orig_lhs_type = lhs->GetCompilerType();
1292 auto orig_rhs_type = rhs->GetCompilerType();
1295 return type_or_err.takeError();
1299 std::string errMsg =
1300 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
1301 orig_lhs_type.GetTypeName(), orig_rhs_type.GetTypeName());
1302 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
1308llvm::Expected<lldb::ValueObjectSP>
1317 return lhs_or_err.takeError();
1321 return rhs_or_err.takeError();
1327 std::string errMsg =
1328 llvm::formatv(
"invalid operands to binary expression ('{0}' and '{1}')",
1330 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, location);
1334 uint64_t amount = rhs->GetValueAsUnsigned(0, &success);
1336 return llvm::make_error<DILDiagnosticError>(
1337 m_expr,
"could not get the shift amount as an integer", location);
1338 llvm::Expected<uint64_t> lhs_size =
1341 return lhs_size.takeError();
1342 if (amount >= *lhs_size)
1343 return llvm::make_error<DILDiagnosticError>(
m_expr,
"invalid shift amount",
1349llvm::Expected<lldb::ValueObjectSP>
1359 auto lhs_type = lhs->GetCompilerType();
1360 if (!lhs_type.IsContextuallyConvertibleToBool()) {
1361 std::string errMsg = llvm::formatv(
1362 "value of type {0} is not contextually convertible to 'bool'",
1363 lhs_type.TypeDescription());
1364 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
1369 return type_system.takeError();
1373 auto lvalue_or_err = lhs->GetValueAsBool();
1375 return lvalue_or_err.takeError();
1376 bool lhs_val = *lvalue_or_err;
1387 auto rhs_type = rhs->GetCompilerType();
1388 if (!rhs_type.IsContextuallyConvertibleToBool()) {
1389 std::string errMsg = llvm::formatv(
1390 "value of type {0} is not contextually convertible to 'bool'",
1391 rhs_type.TypeDescription());
1392 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
1396 auto rvalue_or_err = rhs->GetValueAsBool();
1398 return rvalue_or_err.takeError();
1400 *rvalue_or_err,
"result");
1403llvm::Expected<lldb::ValueObjectSP>
1422 lhs->GetCompilerType().GetTypeSystem().GetSharedPointer();
1424 rhs->GetCompilerType().GetTypeSystem().GetSharedPointer();
1425 if (lhs_system->GetPluginName() != rhs_system->GetPluginName()) {
1427 return llvm::make_error<DILDiagnosticError>(
1529 return llvm::make_error<DILDiagnosticError>(
1533llvm::Expected<lldb::ValueObjectSP>
1538 frame_sp ? frame_sp->GetRegisterContext() :
nullptr;
1541 reg_ctx_sp->GetRegisterInfoByName(*register_name))
1543 m_exe_ctx.GetBestExecutionContextScope(), reg_ctx_sp, reg_info);
1557 if (!base->IsPointerType() && base->HasSyntheticValue()) {
1560 base->GetSyntheticValue()->Dereference(deref_error);
1561 synth_deref_sp && deref_error.
Success()) {
1562 base = std::move(synth_deref_sp);
1564 if (!base || deref_error.
Fail()) {
1565 std::string errMsg = llvm::formatv(
1566 "Failed to dereference synthetic value: {0}", deref_error);
1567 return llvm::make_error<DILDiagnosticError>(
1573 std::string errMsg =
"Failed to dereference synthetic value";
1574 return llvm::make_error<DILDiagnosticError>(
1577 expr_is_ptr =
false;
1582 bool base_is_ptr = base->IsPointerType();
1584 if (expr_is_ptr != base_is_ptr) {
1586 std::string errMsg =
1587 llvm::formatv(
"member reference type {0} is a pointer; "
1588 "did you mean to use '->'?",
1589 base->GetCompilerType().TypeDescription());
1590 return llvm::make_error<DILDiagnosticError>(
1593 std::string errMsg =
1594 llvm::formatv(
"member reference type {0} is not a pointer; "
1595 "did you mean to use '.'?",
1596 base->GetCompilerType().TypeDescription());
1597 return llvm::make_error<DILDiagnosticError>(
1607 field_obj = base->GetSyntheticValue();
1609 field_obj = field_obj->GetChildMemberWithName(node.
GetFieldName());
1613 std::string errMsg = llvm::formatv(
1614 "\"{0}\" is not a member of \"({1}) {2}\"", node.
GetFieldName(),
1615 base->GetTypeName().AsCString(
"<invalid type>"), base->GetName());
1616 return llvm::make_error<DILDiagnosticError>(
1626 field_obj = dynamic_val_sp;
1632 if (node.
GetIsArrow() && base->IsPointerType())
1634 std::string errMsg = llvm::formatv(
1635 "\"{0}\" is not a member of \"({1}) {2}\"", node.
GetFieldName(),
1636 base->GetTypeName().AsCString(
"<invalid type>"), base->GetName());
1637 return llvm::make_error<DILDiagnosticError>(
1641llvm::Expected<lldb::ValueObjectSP>
1648 if (!idx->GetCompilerType().IsIntegerOrUnscopedEnumerationType()) {
1649 return llvm::make_error<DILDiagnosticError>(
1654 uint64_t child_idx = idx->GetValueAsUnsigned(0);
1662 CompilerType base_type = base->GetCompilerType().GetNonReferenceType();
1663 base->GetExpressionPath(var_expr_path_strm);
1666 child_idx > std::numeric_limits<uint32_t>::max()) {
1667 std::string err_msg = llvm::formatv(
1668 "array index {0} is not valid for \"({1}) {2}\"", child_idx,
1669 base->GetTypeName().AsCString(
"<invalid type>"),
1670 var_expr_path_strm.
GetData());
1671 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1675 bool is_incomplete_array =
false;
1677 bool is_objc_pointer =
true;
1680 is_objc_pointer =
false;
1681 else if (!base->GetCompilerType().IsPointerType())
1682 is_objc_pointer =
false;
1685 std::string err_msg = llvm::formatv(
1686 "\"({0}) {1}\" is an Objective-C pointer, and cannot be subscripted",
1687 base->GetTypeName().AsCString(
"<invalid type>"),
1688 var_expr_path_strm.
GetData());
1689 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1692 if (is_objc_pointer) {
1694 if (!synthetic || synthetic == base) {
1695 std::string err_msg =
1696 llvm::formatv(
"\"({0}) {1}\" is not an array type",
1697 base->GetTypeName().AsCString(
"<invalid type>"),
1698 var_expr_path_strm.
GetData());
1699 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1702 if (
static_cast<uint32_t
>(child_idx) >=
1703 synthetic->GetNumChildrenIgnoringErrors()) {
1704 std::string err_msg = llvm::formatv(
1705 "array index {0} is not valid for \"({1}) {2}\"", child_idx,
1706 base->GetTypeName().AsCString(
"<invalid type>"),
1707 var_expr_path_strm.
GetData());
1708 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1711 child_valobj_sp = synthetic->GetChildAtIndex(child_idx);
1712 if (!child_valobj_sp) {
1713 std::string err_msg = llvm::formatv(
1714 "array index {0} is not valid for \"({1}) {2}\"", child_idx,
1715 base->GetTypeName().AsCString(
"<invalid type>"),
1716 var_expr_path_strm.
GetData());
1717 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1721 if (
auto dynamic_sp = child_valobj_sp->GetDynamicValue(
m_use_dynamic))
1722 child_valobj_sp = std::move(dynamic_sp);
1724 return child_valobj_sp;
1727 child_valobj_sp = base->GetSyntheticArrayMember(child_idx,
true);
1728 if (!child_valobj_sp) {
1729 std::string err_msg = llvm::formatv(
1730 "failed to use pointer as array for index {0} for "
1732 child_idx, base->GetTypeName().AsCString(
"<invalid type>"),
1733 var_expr_path_strm.
GetData());
1735 err_msg =
"subscript of pointer to incomplete type 'void'";
1736 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1739 }
else if (base_type.
IsArrayType(
nullptr,
nullptr, &is_incomplete_array) ||
1741 child_valobj_sp = base->GetChildAtIndex(child_idx);
1743 child_valobj_sp = base->GetSyntheticArrayMember(child_idx,
true);
1744 if (!child_valobj_sp) {
1745 std::string err_msg = llvm::formatv(
1746 "array index {0} is not valid for \"({1}) {2}\"", child_idx,
1747 base->GetTypeName().AsCString(
"<invalid type>"),
1748 var_expr_path_strm.
GetData());
1749 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1754 base->GetSyntheticBitFieldChild(child_idx, child_idx,
true);
1755 if (!child_valobj_sp) {
1756 std::string err_msg = llvm::formatv(
1757 "bitfield range {0}:{1} is not valid for \"({2}) {3}\"", child_idx,
1758 child_idx, base->GetTypeName().AsCString(
"<invalid type>"),
1759 var_expr_path_strm.
GetData());
1760 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1766 std::string err_msg =
1767 llvm::formatv(
"\"{0}\" is not an array type",
1768 base->GetTypeName().AsCString(
"<invalid type>"));
1769 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1772 if (
static_cast<uint32_t
>(child_idx) >=
1773 synthetic->GetNumChildrenIgnoringErrors(child_idx + 1)) {
1774 std::string err_msg = llvm::formatv(
1775 "array index {0} is not valid for \"({1}) {2}\"", child_idx,
1776 base->GetTypeName().AsCString(
"<invalid type>"),
1777 var_expr_path_strm.
GetData());
1778 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1781 child_valobj_sp = synthetic->GetChildAtIndex(child_idx);
1782 if (!child_valobj_sp) {
1783 std::string err_msg = llvm::formatv(
1784 "array index {0} is not valid for \"({1}) {2}\"", child_idx,
1785 base->GetTypeName().AsCString(
"<invalid type>"),
1786 var_expr_path_strm.
GetData());
1787 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(err_msg),
1792 if (child_valobj_sp) {
1794 if (
auto dynamic_sp = child_valobj_sp->GetDynamicValue(
m_use_dynamic))
1795 child_valobj_sp = std::move(dynamic_sp);
1797 return child_valobj_sp;
1801 int64_t signed_child_idx = idx->GetValueAsSigned(0, &success);
1803 return llvm::make_error<DILDiagnosticError>(
1804 m_expr,
"could not get the index as an integer",
1806 return base->GetSyntheticArrayMember(signed_child_idx,
true);
1809llvm::Expected<lldb::ValueObjectSP>
1812 if (!first_idx_or_err)
1813 return first_idx_or_err;
1816 if (!last_idx_or_err)
1817 return last_idx_or_err;
1820 if (!first_idx->GetCompilerType().IsIntegerOrUnscopedEnumerationType() ||
1821 !last_idx->GetCompilerType().IsIntegerOrUnscopedEnumerationType()) {
1822 return llvm::make_error<DILDiagnosticError>(
1826 bool success_first, success_last;
1827 int64_t first_index = first_idx->GetValueAsSigned(0, &success_first);
1828 int64_t last_index = last_idx->GetValueAsSigned(0, &success_last);
1829 if (!success_first || !success_last)
1830 return llvm::make_error<DILDiagnosticError>(
1836 if (first_index < 0 || last_index < 0) {
1837 std::string message =
1838 llvm::formatv(
"bitfield range {0}:{1} is not valid (negative index)",
1839 first_index, last_index);
1840 return llvm::make_error<DILDiagnosticError>(
m_expr, message,
1845 if (first_index > last_index)
1846 std::swap(first_index, last_index);
1851 if (last_index - first_index >= 64) {
1852 std::string message =
1853 llvm::formatv(
"bitfield range {0}:{1} is not valid (more than 64 bits)",
1854 first_index, last_index);
1855 return llvm::make_error<DILDiagnosticError>(
m_expr, message,
1867 llvm::Expected<uint64_t> base_bit_size = base->GetCompilerType().GetBitSize(
1868 m_exe_ctx.GetBestExecutionContextScope());
1870 return base_bit_size.takeError();
1871 if (
static_cast<uint64_t
>(last_index) >= *base_bit_size) {
1872 std::string message = llvm::formatv(
1873 "bitfield range {0}:{1} is not valid for \"({2}) {3}\"", first_index,
1874 last_index, base->GetTypeName().AsCString(
"<invalid type>"),
1875 base->GetName().GetStringRef());
1876 return llvm::make_error<DILDiagnosticError>(
m_expr, message,
1881 base->GetSyntheticBitFieldChild(first_index, last_index,
true);
1882 if (!child_valobj_sp) {
1883 std::string message = llvm::formatv(
1884 "bitfield range {0}:{1} is not valid for \"({2}) {3}\"", first_index,
1885 last_index, base->GetTypeName().AsCString(
"<invalid type>"),
1886 base->GetName().GetStringRef());
1887 return llvm::make_error<DILDiagnosticError>(
m_expr, message,
1890 return child_valobj_sp;
1893llvm::Expected<CompilerType>
1900 llvm::APInt apint = literal.
GetValue();
1902 llvm::SmallVector<std::pair<lldb::BasicType, lldb::BasicType>, 3> candidates;
1913 for (
auto [signed_, unsigned_] : candidates) {
1914 CompilerType signed_type = type_system->GetBasicTypeFromAST(signed_);
1917 llvm::Expected<uint64_t> size =
1920 return size.takeError();
1921 if (!literal.
IsUnsigned() && apint.isIntN(*size - 1))
1924 return type_system->GetBasicTypeFromAST(unsigned_);
1927 return llvm::make_error<DILDiagnosticError>(
1929 "integer literal is too large to be represented in any integer type",
1933llvm::Expected<lldb::ValueObjectSP>
1937 return type_system.takeError();
1939 llvm::Expected<CompilerType> type =
1942 return type.takeError();
1947 llvm::Expected<uint64_t> type_bitsize =
1948 type->GetBitSize(
m_exe_ctx.GetBestExecutionContextScope());
1950 return type_bitsize.takeError();
1954 if (type->IsSigned())
1960llvm::Expected<lldb::ValueObjectSP>
1964 return type_system.takeError();
1967 &node.
GetValue().getSemantics() == &llvm::APFloat::IEEEsingle();
1973 return llvm::make_error<DILDiagnosticError>(
1981llvm::Expected<lldb::ValueObjectSP>
1986 return type_system.takeError();
1991llvm::Expected<CastKind>
1996 if (target_type.
GetTypeInfo() & lldb::eTypeIsFloat) {
1997 std::string errMsg = llvm::formatv(
"Cast from {0} to {1} is not allowed",
2000 return llvm::make_error<DILDiagnosticError>(
2001 m_expr, std::move(errMsg), location,
2011 uint64_t type_byte_size = 0;
2012 uint64_t rhs_type_byte_size = 0;
2015 type_byte_size = *temp;
2017 std::string errMsg = llvm::formatv(
"unable to get byte size for type {0}",
2020 "GetByteSize failed: {0}");
2021 return llvm::make_error<DILDiagnosticError>(
2022 m_expr, std::move(errMsg), location,
2028 rhs_type_byte_size = *temp;
2030 std::string errMsg = llvm::formatv(
"unable to get byte size for type {0}",
2033 "GetByteSize failed: {0}");
2034 return llvm::make_error<DILDiagnosticError>(
2035 m_expr, std::move(errMsg), location,
2039 if (type_byte_size < rhs_type_byte_size) {
2040 std::string errMsg = llvm::formatv(
2041 "cast from pointer to smaller type {0} loses information",
2043 return llvm::make_error<DILDiagnosticError>(
2044 m_expr, std::move(errMsg), location,
2049 std::string errMsg = llvm::formatv(
"cannot convert {0} to {1}",
2053 return llvm::make_error<DILDiagnosticError>(
2054 m_expr, std::move(errMsg), location,
2060llvm::Expected<CastKind>
2071 std::string errMsg = llvm::formatv(
"Cast from {0} to {1} is not allowed",
2075 return llvm::make_error<DILDiagnosticError>(
2076 m_expr, std::move(errMsg), location,
2086 std::string errMsg = llvm::formatv(
2087 "cannot cast from type {0} to pointer type {1}",
2090 return llvm::make_error<DILDiagnosticError>(
2091 m_expr, std::move(errMsg), location,
2098 std::string errMsg = llvm::formatv(
2099 "casting of {0} to {1} is not implemented yet",
2101 return llvm::make_error<DILDiagnosticError>(
2102 m_expr, std::move(errMsg), location,
2109 if (!operand_or_err)
2110 return operand_or_err;
2120 operand->GetName().GetStringRef());
2121 op_type = operand->GetCompilerType();
2126 return type_or_err.takeError();
2129 if (operand->GetCompilerType().IsReferenceType()) {
2131 operand = operand->Dereference(
error);
2133 return llvm::make_error<DILDiagnosticError>(
m_expr,
error.AsCString(),
2138 switch (cast_kind) {
2143 result = operand->CastToEnumType(target_type);
2149 result = operand->CastToBasicType(target_type);
2154 ? operand->GetLoadAddress()
2155 : (op_type.
IsSigned() ? operand->GetValueAsSigned(0)
2156 : operand->GetValueAsUnsigned(0));
2169 if (result->GetError().Fail())
2170 return llvm::make_error<DILDiagnosticError>(
2175 std::string errMsg =
2176 llvm::formatv(
"unable to cast from '{0}' to '{1}'",
2178 return llvm::make_error<DILDiagnosticError>(
m_expr, std::move(errMsg),
2182llvm::Expected<lldb::ValueObjectSP>
2191 std::string errMsg = llvm::formatv(
2192 "value of type {0} is not contextually convertible to 'bool'",
2194 return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg,
2199 auto value_or_err = condition->GetValueAsBool();
2201 if (*value_or_err) {
2205 return *true_or_err;
2209 return false_or_err;
2210 return *false_or_err;
2212 return value_or_err.takeError();
2221 llvm::Expected<uint64_t> byte_size =
2224 return byte_size.takeError();
2232 if (arg->IsBitfield())
2233 return llvm::make_error<DILDiagnosticError>(
2234 m_expr,
"invalid application of 'sizeof' to bit-field",
2237 llvm::Expected<uint64_t> byte_size = arg->GetByteSize();
2239 return byte_size.takeError();
2245 return type_system.takeError();
2246 CompilerType size_type = type_system.get()->GetSizeType();
2248 return llvm::make_error<DILDiagnosticError>(
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_ERROR(log, error,...)
static llvm::StringRef GetName(XcodeSDK::Type type)
lldb::VariableListSP GetVariableList(bool can_create)
Get the variable list for a compile unit.
lldb::LanguageType GetLanguage()
Generic representation of a type in a programming language.
bool IsEnumerationType(bool &is_signed) const
lldb::BasicType GetBasicTypeEnumeration() const
bool IsArrayType(CompilerType *element_type=nullptr, uint64_t *size=nullptr, bool *is_incomplete=nullptr) const
bool IsScalarOrUnscopedEnumerationType() const
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
bool IsContextuallyConvertibleToBool() const
This may only be defined in TypeSystemClang.
llvm::Expected< uint64_t > GetByteSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bytes.
bool IsPointerToVoid() const
void ForEachEnumerator(std::function< bool(const CompilerType &integer_type, ConstString name, const llvm::APSInt &value)> const &callback) const
If this type is an enumeration, iterate through all of its enumerators using a callback.
bool IsIntegerOrEnumerationType(bool &is_signed) const
bool IsScopedEnumerationType() const
CompilerType GetNonReferenceType() const
If this type is a reference to a type (L value or R value reference), return a new type with the refe...
ConstString GetTypeName(bool BaseOnly=false) const
bool IsReferenceType(CompilerType *pointee_type=nullptr, bool *is_rvalue=nullptr) const
std::string TypeDescription()
CompilerType GetArrayElementType(ExecutionContextScope *exe_scope) const
Creating related types.
bool IsInteger() const
This is used when you don't care about the signedness of the integer.
CompilerType GetFullyUnqualifiedType() const
CompilerType GetPointeeType() const
If this type is a pointer type, return the type that the pointer points to, else return an invalid ty...
bool IsUnscopedEnumerationType() const
uint32_t GetTypeInfo(CompilerType *pointee_or_element_compiler_type=nullptr) const
bool CompareTypes(CompilerType rhs) const
llvm::Expected< uint64_t > GetBitSize(ExecutionContextScope *exe_scope) const
Return the size of the type in bits.
bool IsScalarType() const
bool IsVectorType(CompilerType *element_type=nullptr, uint64_t *size=nullptr) const
bool IsNullPtrType() const
CompilerType GetCanonicalType() const
bool IsPointerType(CompilerType *pointee_type=nullptr) const
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
const lldb::StackFrameSP & GetFrameSP() const
Get accessor to get the frame shared pointer.
void TruncOrExtendTo(uint16_t bits, bool sign)
Convert to an integer with bits and the given signedness.
@ eExpressionPathOptionCheckPtrVsMember
@ eExpressionPathOptionsDisallowGlobals
@ eExpressionPathOptionsAllowVarUpdates
@ eExpressionPathOptionsNoSyntheticChildren
bool Fail() const
Test for error condition.
bool Success() const
Test for success condition.
const char * GetData() const
Defines a symbol context baton that can be handed other debug core functions.
llvm::StringRef GetInstanceName()
Determines the name of the instance for this decl context.
lldb::ModuleSP module_sp
The Module for a given query.
CompileUnit * comp_unit
The CompileUnit for a given query.
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, const RegisterInfo *reg_info)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, const lldb::VariableSP &var_sp)
static lldb::ValueObjectSP CreateValueObjectFromScalar(const ExecutionContext &exe_ctx, Scalar &s, CompilerType type, llvm::StringRef name, ValueObject *parent=nullptr)
Create a value object containing the given Scalar value.
static lldb::ValueObjectSP CreateValueObjectFromBool(const ExecutionContext &exe_ctx, lldb::TypeSystemSP typesystem, bool value, llvm::StringRef name, ValueObject *parent=nullptr)
Create a value object containing the given boolean value.
lldb::addr_t GetLoadAddress()
Return the target load address associated with this value object.
CompilerType GetCompilerType()
static lldb::ValueObjectSP CreateValueObjectFromAddress(llvm::StringRef name, uint64_t address, const ExecutionContext &exe_ctx, CompilerType type, bool do_deref=true, ValueObject *parent=nullptr)
Given an address either create a value object containing the value at that address,...
The rest of the classes in this file, except for the Visitor class at the very end,...
uint32_t GetLocation() const
virtual bool IsConstLiteral() const
virtual llvm::Expected< lldb::ValueObjectSP > Accept(Visitor *v) const =0
ASTNode & GetBase() const
ASTNode & GetIndex() const
BinaryOpKind GetKind() const
ASTNode & GetOperand() const
CompilerType GetType() const
ASTNode & GetFalseOperand() const
ASTNode & GetTrueOperand() const
ASTNode & GetCondition() const
const llvm::APFloat & GetValue() const
std::string GetName() const
uint32_t GetRadix() const
IntegerTypeSuffix GetTypeSuffix() const
const llvm::APInt & GetValue() const
llvm::Expected< lldb::ValueObjectSP > EvaluateBinaryRemainder(lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
llvm::Error ValidateComparison(BinaryOpKind kind, lldb::ValueObjectSP &lhs, lldb::ValueObjectSP &rhs, bool lhs_is_literal, bool rhs_is_literal, uint32_t location)
llvm::Expected< lldb::ValueObjectSP > Evaluate(const ASTNode &node)
Evaluate an ASTNode.
llvm::Expected< lldb::ValueObjectSP > EvaluateBinaryAddition(lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
llvm::Expected< lldb::ValueObjectSP > EvaluateAndDereference(const ASTNode &node)
Evaluate an ASTNode.
llvm::Expected< lldb::ValueObjectSP > PointerOffset(lldb::ValueObjectSP ptr, lldb::ValueObjectSP offset, BinaryOpKind operation, uint32_t location)
Add or subtract the offset to the pointer according to the pointee type byte size.
llvm::Expected< lldb::ValueObjectSP > EvaluateScalarOp(BinaryOpKind kind, lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, CompilerType result_type, uint32_t location)
llvm::Expected< CompilerType > PromoteSignedInteger(CompilerType &lhs_type, CompilerType &rhs_type)
If lhs_type is unsigned and rhs_type is signed, check whether it can represent all of the values of l...
llvm::Expected< lldb::ValueObjectSP > EvaluateBinaryShift(BinaryOpKind kind, lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
llvm::Expected< lldb::ValueObjectSP > EvaluateLogical(const BinaryOpNode &node)
llvm::Expected< lldb::ValueObjectSP > EvaluateTree(const ASTNodeUP &tree)
Evaluate an ASTNode tree.
Interpreter(ExecutionContext &exe_ctx, llvm::StringRef expr, lldb::DynamicValueType use_dynamic, uint32_t options)
llvm::Expected< lldb::ValueObjectSP > EvaluateBinarySubtraction(lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
llvm::Expected< lldb::ValueObjectSP > UnaryConversion(lldb::ValueObjectSP valobj, uint32_t location)
Perform usual unary conversions on a value.
llvm::Expected< lldb::ValueObjectSP > EvaluateComparison(BinaryOpKind kind, lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, bool lhs_is_literal, bool rhs_is_literal, uint32_t location)
llvm::Expected< lldb::ValueObjectSP > Visit(const IdentifierNode &node) override
bool m_check_ptr_vs_member
llvm::Expected< lldb::LanguageType > GetSourceLanguageFromCU()
Retrieve the LanguageType from the compile unit of the current frame.
llvm::Expected< lldb::ValueObjectSP > EvaluateBinaryDivision(lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
lldb::DynamicValueType m_use_dynamic
llvm::Expected< CompilerType > PickIntegerType(lldb::TypeSystemSP type_system, ExecutionContext &ext_ctx, const IntegerLiteralNode &literal)
llvm::Expected< CompilerType > ArithmeticConversion(lldb::ValueObjectSP &lhs, lldb::ValueObjectSP &rhs, uint32_t location)
Perform an arithmetic conversion on two values from an arithmetic operation.
llvm::Expected< lldb::ValueObjectSP > EvaluateBinaryMultiplication(lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
llvm::Expected< CastKind > VerifyCastType(lldb::ValueObjectSP operand, CompilerType source_type, CompilerType target_type, int location)
As a preparation for type casting, compare the requested 'target' type of the cast with the type of t...
llvm::Expected< lldb::ValueObjectSP > EvaluateAssignment(lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
llvm::Expected< CastKind > VerifyArithmeticCast(CompilerType source_type, CompilerType target_type, int location)
A helper function for VerifyCastType (below).
llvm::Expected< lldb::TypeSystemSP > GetTypeSystemFromCU()
Retrieve the TypeSystem from the compile unit of the current frame.
llvm::Expected< lldb::ValueObjectSP > EvaluateBinaryBitwise(BinaryOpKind kind, lldb::ValueObjectSP lhs, lldb::ValueObjectSP rhs, uint32_t location)
ExecutionContext m_exe_ctx
llvm::StringRef GetFieldName() const
ASTNode & GetBase() const
ASTNode & GetNodeArg() const
CompilerType GetTypeArg() const
UnaryOpKind GetKind() const
ASTNode & GetOperand() const
CastKind
The type casts allowed by DIL.
@ eEnumeration
Casting from a scalar to an enumeration type.
@ ePointer
Casting to a pointer type.
@ eNone
Invalid promotion type (results in error).
@ eArithmetic
Casting to a scalar.
static lldb::BasicType BasicTypeToUnsigned(lldb::BasicType basic_type)
static bool IsLiteralZero(lldb::ValueObjectSP &val, bool is_literal)
static CompilerType GetBasicType(lldb::TypeSystemSP type_system, lldb::BasicType basic_type)
std::unique_ptr< ASTNode > ASTNodeUP
lldb::ValueObjectSP LookupPersistentIdentifier(llvm::StringRef name_ref, ExecutionContext &exe_ctx, lldb::LanguageType language)
Given the name of a persistent identifier (i.e., one that starts with a $), find the ValueObject for ...
BinaryOpKind
The binary operators recognized by DIL.
static llvm::Expected< bool > VerifyAssignmentTypes(CompilerType lhs_type, CompilerType rhs_type)
static lldb::ValueObjectSP ArrayToPointerConversion(ValueObject &valobj, ExecutionContext &exe_ctx, llvm::StringRef name)
static size_t ConversionRank(CompilerType type)
Basic types with a lower rank are converted to the basic type with a higher rank.
lldb::ValueObjectSP LookupGlobalIdentifier(llvm::StringRef name_ref, ExecutionContext &exe_ctx, lldb::DynamicValueType use_dynamic)
Given the name of an identifier, check to see if it matches the name of a global variable.
lldb::ValueObjectSP LookupIdentifier(llvm::StringRef name_ref, ExecutionContext &exe_ctx, lldb::DynamicValueType use_dynamic)
Given the name of an identifier (variable name, member name, type name, etc.), find the ValueObject f...
static lldb::VariableSP DILFindVariable(ConstString name, VariableList &variable_list)
static llvm::Expected< SymbolContext > GetSymbolContexFromFrame(ExecutionContext &exe_ctx)
static std::optional< std::string > GetRegisterPathName(const ASTNode &node)
static bool HasFloatingRepresentation(CompilerType ct)
lldb::ValueObjectSP LookupEnumValue(llvm::StringRef name_ref, ExecutionContext &exe_ctx)
Given the name of an identifier, attempt to find an enumeration value.
CompilerType ResolveTypeByName(const std::string &name, ExecutionContext &exe_ctx)
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::TypeSystem > TypeSystemSP
BasicType
Basic types enumeration for the public API SBType::GetBasicType().
@ eBasicTypeUnsignedShort
@ eBasicTypeUnsignedInt128
@ eBasicTypeUnsignedLongLong
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::Variable > VariableSP
@ eValueTypeRegister
stack frame register value
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
Every register is described in detail including its name, alternate name (optional),...