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;
925 const uint32_t num_children = return_compiler_type.
GetNumFields();
929 if (num_children <= 2) {
930 uint64_t field_bit_offset = 0;
933 for (uint32_t idx = 0; idx < num_children; idx++) {
938 if (field_compiler_type.
GetTypeInfo() & eTypeIsFloat)
941 found_non_fp_field =
true;
944 if (use_fp_regs && !found_non_fp_field) {
957 for (uint32_t idx = 0; idx < num_children; idx++) {
960 idx, name, &field_bit_offset,
nullptr,
nullptr);
961 std::optional<uint64_t> field_byte_width = llvm::expectedToOptional(
963 if (!field_byte_width)
964 return return_valobj_sp;
967 uint64_t return_value[2];
972 if (*field_byte_width == 16) {
977 return_value[0] = f0_data.
GetU64(&offset);
981 return_value[1] = f1_data.
GetU64(&offset);
983 return_value[1] = f0_data.
GetU64(&offset);
987 return_value[0] = f1_data.
GetU64(&offset);
990 f0_data.
SetData(return_value, *field_byte_width,
993 copy_from_extractor = &f0_data;
999 copy_from_extractor = &f2_data;
1003 if (!copy_from_extractor ||
1004 *field_byte_width > copy_from_extractor->
GetByteSize())
1005 return return_valobj_sp;
1009 0, *field_byte_width,
1010 data_sp->GetBytes() + (field_bit_offset / 8), *field_byte_width,
1017 &thread, return_compiler_type,
ConstString(
""), return_ext);
1019 return return_valobj_sp;
1026 for (uint32_t idx = 0; idx < num_children; idx++) {
1027 uint64_t field_bit_offset = 0;
1032 idx, name, &field_bit_offset,
nullptr,
nullptr);
1033 std::optional<uint64_t> field_byte_width =
1034 llvm::expectedToOptional(field_compiler_type.
GetByteSize(&thread));
1038 if (!field_byte_width || *field_byte_width == 0)
1041 uint32_t field_byte_offset = field_bit_offset / 8;
1045 field_compiler_type.
GetTypeInfo() & eTypeIsFloat) {
1046 padding = field_byte_offset - integer_bytes;
1048 if (integer_bytes < 8) {
1050 if (integer_bytes + *field_byte_width + padding <= 8) {
1053 integer_bytes = integer_bytes + *field_byte_width +
1059 integer_bytes = integer_bytes + *field_byte_width +
1066 else if (integer_bytes + *field_byte_width + padding <= 16) {
1067 integer_bytes = integer_bytes + *field_byte_width + padding;
1074 return return_valobj_sp;
1079 if (type_flags & eTypeIsVector) {
1080 if (*byte_size <= 8)
1092 *r2_info, data_sp->GetBytes(), r2_info->
byte_size,
1093 target_byte_order,
error);
1095 return return_valobj_sp;
1101 *r3_info, data_sp->GetBytes() + r2_info->
byte_size,
1105 return return_valobj_sp;
1112 &thread, return_compiler_type,
ConstString(
""), return_ext);
1114 return return_valobj_sp;
1124 &thread,
"",
Address(mem_address,
nullptr), return_compiler_type);
1126 return return_valobj_sp;
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0