742 return return_valobj_sp;
748 return return_valobj_sp;
753 std::optional<uint64_t> byte_size =
754 llvm::expectedToOptional(return_compiler_type.
GetByteSize(&thread));
756 return return_valobj_sp;
757 const uint32_t type_flags = return_compiler_type.
GetTypeInfo(
nullptr);
763 assert(r2_info && r3_info &&
"Basic registers should always be present.");
765 if (type_flags & eTypeIsScalar || type_flags & eTypeIsPointer) {
768 bool success =
false;
769 if (type_flags & eTypeIsInteger || type_flags & eTypeIsPointer) {
775 const bool is_signed = (type_flags & eTypeIsSigned) != 0;
776 switch (*byte_size) {
780 case sizeof(uint64_t):
782 value.
GetScalar() = (int64_t)(raw_value);
784 value.
GetScalar() = (uint64_t)(raw_value);
788 case sizeof(uint32_t):
796 case sizeof(uint16_t):
798 value.
GetScalar() = (int16_t)(raw_value & UINT16_MAX);
800 value.
GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
804 case sizeof(uint8_t):
806 value.
GetScalar() = (int8_t)(raw_value & UINT8_MAX);
808 value.
GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
812 }
else if (type_flags & eTypeIsFloat) {
813 if (type_flags & eTypeIsComplex) {
817 switch (*byte_size) {
819 value.
GetScalar() = *((
float *)(&raw_value));
823 value.
GetScalar() = *((
double *)(&raw_value));
829 result[0] = raw_value;
831 value.
GetScalar() = *((
long double *)(result));
834 result[1] = raw_value;
835 value.
GetScalar() = *((
long double *)(result));
842 if (*byte_size <=
sizeof(
long double)) {
853 if (*byte_size ==
sizeof(
float)) {
856 }
else if (*byte_size ==
sizeof(
double)) {
859 }
else if (*byte_size ==
sizeof(
long double)) {
868 data_sp, target_byte_order,
872 copy_from_extractor = &f0_data;
874 0, 8, data_sp->GetBytes(), *byte_size - 8, target_byte_order);
876 copy_from_extractor = &f2_data;
878 0, 8, data_sp->GetBytes() + 8, *byte_size - 8,
881 copy_from_extractor = &f0_data;
883 0, 8, data_sp->GetBytes() + 8, *byte_size - 8,
886 copy_from_extractor = &f2_data;
888 0, 8, data_sp->GetBytes(), *byte_size - 8, target_byte_order);
892 &thread, return_compiler_type,
ConstString(
""), return_ext);
893 return return_valobj_sp;
901 thread.GetStackFrameAtIndex(0).get(), value,
ConstString(
""));
902 }
else if (type_flags & eTypeIsStructUnion || type_flags & eTypeIsClass ||
903 type_flags & eTypeIsVector) {
905 if (*byte_size <= 16) {
910 RegisterValue r2_value, r3_value, f0_value, f1_value, f2_value;
912 uint32_t integer_bytes = 0;
915 bool use_fp_regs =
false;
917 bool found_non_fp_field =
false;
926 const uint32_t num_children = return_compiler_type.
GetNumFields();
930 if (num_children <= 2) {
931 uint64_t field_bit_offset = 0;
934 for (uint32_t idx = 0; idx < num_children; idx++) {
942 found_non_fp_field =
true;
945 if (use_fp_regs && !found_non_fp_field) {
958 for (uint32_t idx = 0; idx < num_children; idx++) {
961 idx, name, &field_bit_offset,
nullptr,
nullptr);
962 std::optional<uint64_t> field_byte_width = llvm::expectedToOptional(
964 if (!field_byte_width)
965 return return_valobj_sp;
968 uint64_t return_value[2];
973 if (*field_byte_width == 16) {
978 return_value[0] = f0_data.
GetU64(&offset);
982 return_value[1] = f1_data.
GetU64(&offset);
984 return_value[1] = f0_data.
GetU64(&offset);
988 return_value[0] = f1_data.
GetU64(&offset);
991 f0_data.
SetData(return_value, *field_byte_width,
994 copy_from_extractor = &f0_data;
1000 copy_from_extractor = &f2_data;
1004 if (!copy_from_extractor ||
1005 *field_byte_width > copy_from_extractor->
GetByteSize())
1006 return return_valobj_sp;
1010 0, *field_byte_width,
1011 data_sp->GetBytes() + (field_bit_offset / 8), *field_byte_width,
1018 &thread, return_compiler_type,
ConstString(
""), return_ext);
1020 return return_valobj_sp;
1027 for (uint32_t idx = 0; idx < num_children; idx++) {
1028 uint64_t field_bit_offset = 0;
1033 idx, name, &field_bit_offset,
nullptr,
nullptr);
1034 std::optional<uint64_t> field_byte_width =
1035 llvm::expectedToOptional(field_compiler_type.
GetByteSize(&thread));
1039 if (!field_byte_width || *field_byte_width == 0)
1042 uint32_t field_byte_offset = field_bit_offset / 8;
1047 padding = field_byte_offset - integer_bytes;
1049 if (integer_bytes < 8) {
1051 if (integer_bytes + *field_byte_width + padding <= 8) {
1054 integer_bytes = integer_bytes + *field_byte_width +
1060 integer_bytes = integer_bytes + *field_byte_width +
1067 else if (integer_bytes + *field_byte_width + padding <= 16) {
1068 integer_bytes = integer_bytes + *field_byte_width + padding;
1075 return return_valobj_sp;
1080 if (type_flags & eTypeIsVector) {
1081 if (*byte_size <= 8)
1093 *r2_info, data_sp->GetBytes(), r2_info->
byte_size,
1094 target_byte_order,
error);
1096 return return_valobj_sp;
1102 *r3_info, data_sp->GetBytes() + r2_info->
byte_size,
1106 return return_valobj_sp;
1113 &thread, return_compiler_type,
ConstString(
""), return_ext);
1115 return return_valobj_sp;
1125 &thread,
"",
Address(mem_address,
nullptr), return_compiler_type);
1127 return return_valobj_sp;
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0