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;
927 const uint32_t num_children = return_compiler_type.
GetNumFields();
931 if (num_children <= 2) {
932 uint64_t field_bit_offset = 0;
935 for (uint32_t idx = 0; idx < num_children; idx++) {
943 found_non_fp_field =
true;
946 if (use_fp_regs && !found_non_fp_field) {
959 for (uint32_t idx = 0; idx < num_children; idx++) {
962 idx, name, &field_bit_offset,
nullptr,
nullptr);
963 std::optional<uint64_t> field_byte_width = llvm::expectedToOptional(
965 if (!field_byte_width)
966 return return_valobj_sp;
969 uint64_t return_value[2];
974 if (*field_byte_width == 16) {
979 return_value[0] = f0_data.
GetU64(&offset);
983 return_value[1] = f1_data.
GetU64(&offset);
985 return_value[1] = f0_data.
GetU64(&offset);
989 return_value[0] = f1_data.
GetU64(&offset);
992 f0_data.
SetData(return_value, *field_byte_width,
995 copy_from_extractor = &f0_data;
1001 copy_from_extractor = &f2_data;
1005 if (!copy_from_extractor ||
1006 *field_byte_width > copy_from_extractor->
GetByteSize())
1007 return return_valobj_sp;
1011 0, *field_byte_width,
1012 data_sp->GetBytes() + (field_bit_offset / 8), *field_byte_width,
1019 &thread, return_compiler_type,
ConstString(
""), return_ext);
1021 return return_valobj_sp;
1028 for (uint32_t idx = 0; idx < num_children; idx++) {
1029 uint64_t field_bit_offset = 0;
1034 idx, name, &field_bit_offset,
nullptr,
nullptr);
1035 std::optional<uint64_t> field_byte_width =
1036 llvm::expectedToOptional(field_compiler_type.
GetByteSize(&thread));
1040 if (!field_byte_width || *field_byte_width == 0)
1043 uint32_t field_byte_offset = field_bit_offset / 8;
1048 padding = field_byte_offset - integer_bytes;
1050 if (integer_bytes < 8) {
1052 if (integer_bytes + *field_byte_width + padding <= 8) {
1055 integer_bytes = integer_bytes + *field_byte_width +
1061 integer_bytes = integer_bytes + *field_byte_width +
1068 else if (integer_bytes + *field_byte_width + padding <= 16) {
1069 integer_bytes = integer_bytes + *field_byte_width + padding;
1076 return return_valobj_sp;
1081 if (type_flags & eTypeIsVector) {
1082 if (*byte_size <= 8)
1094 *r2_info, data_sp->GetBytes(), r2_info->
byte_size,
1095 target_byte_order,
error);
1097 return return_valobj_sp;
1103 *r3_info, data_sp->GetBytes() + r2_info->
byte_size,
1107 return return_valobj_sp;
1114 &thread, return_compiler_type,
ConstString(
""), return_ext);
1116 return return_valobj_sp;
1126 &thread,
"",
Address(mem_address,
nullptr), return_compiler_type);
1128 return return_valobj_sp;
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0