11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/Triple.h"
114 #define DEFINE_REG(name, size, alt, generic) \
116 #name, alt, size, 0, eEncodingUint, eFormatHex, \
117 {dwarf_##name##_s390x, dwarf_##name##_s390x, generic, \
118 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, \
178 const lldb_private::RegisterInfo *
190 if (arch.
GetTriple().getArch() == llvm::Triple::systemz) {
191 return ABISP(
new ABISysV_s390x(std::move(process_sp), MakeMCRegisterInfo(arch)));
198 llvm::ArrayRef<addr_t> args)
const {
203 s.
Printf(
"ABISysV_s390x::PrepareTrivialCall (tid = 0x%" PRIx64
204 ", sp = 0x%" PRIx64
", func_addr = 0x%" PRIx64
205 ", return_addr = 0x%" PRIx64,
206 thread.
GetID(), (uint64_t)
sp, (uint64_t)func_addr,
207 (uint64_t)return_addr);
209 for (
size_t i = 0; i < args.size(); ++i)
210 s.
Printf(
", arg%" PRIu64
" = 0x%" PRIx64,
static_cast<uint64_t
>(i + 1),
220 const RegisterInfo *pc_reg_info =
222 const RegisterInfo *sp_reg_info =
230 if (args.size() > 5) {
231 sp -= 8 * (args.size() - 5);
239 for (
size_t i = 0; i < args.size(); ++i) {
243 LLDB_LOGF(log,
"About to write arg%" PRIu64
" (0x%" PRIx64
") into %s",
244 static_cast<uint64_t
>(i + 1), args[i], reg_info->name);
249 LLDB_LOGF(log,
"About to write arg%" PRIu64
" (0x%" PRIx64
") onto stack",
250 static_cast<uint64_t
>(i + 1), args[i]);
251 if (!process_sp->WritePointerToMemory(arg_pos, args[i],
error))
259 LLDB_LOGF(log,
"Writing RA: 0x%" PRIx64, (uint64_t)return_addr);
266 LLDB_LOGF(log,
"Writing SP: 0x%" PRIx64, (uint64_t)
sp);
273 LLDB_LOGF(log,
"Writing PC: 0x%" PRIx64, (uint64_t)func_addr);
282 bool is_signed,
Thread &thread,
284 unsigned int ¤t_argument_register,
285 addr_t ¤t_stack_argument) {
289 if (current_argument_register < 5) {
291 argument_register_ids[current_argument_register], 0);
292 current_argument_register++;
296 uint32_t byte_size = (bit_width + (8 - 1)) / 8;
298 if (thread.
GetProcess()->ReadScalarIntegerFromMemory(
299 current_stack_argument + 8 - byte_size, byte_size, is_signed,
301 current_stack_argument += 8;
310 unsigned int num_values = values.
GetSize();
311 unsigned int value_index;
328 addr_t current_stack_argument =
sp + 160;
332 argument_register_ids[0] =
335 argument_register_ids[1] =
338 argument_register_ids[2] =
341 argument_register_ids[3] =
344 argument_register_ids[4] =
348 unsigned int current_argument_register = 0;
350 for (value_index = 0; value_index < num_values; ++value_index) {
359 llvm::Optional<uint64_t> bit_size = compiler_type.
GetBitSize(&thread);
366 argument_register_ids, current_argument_register,
367 current_stack_argument);
370 argument_register_ids, current_argument_register,
371 current_stack_argument);
379 lldb::ValueObjectSP &new_value_sp) {
382 error.SetErrorString(
"Empty value object for return value.");
386 CompilerType compiler_type = new_value_sp->GetCompilerType();
387 if (!compiler_type) {
388 error.SetErrorString(
"Null clang type for return value.");
392 Thread *thread = frame_sp->GetThread().get();
400 bool set_it_simple =
false;
407 size_t num_bytes = new_value_sp->GetData(data, data_error);
408 if (data_error.
Fail()) {
409 error.SetErrorStringWithFormat(
410 "Couldn't convert return value to raw data: %s",
415 if (num_bytes <= 8) {
416 uint64_t raw_value = data.
GetMaxU64(&offset, num_bytes);
419 set_it_simple =
true;
421 error.SetErrorString(
"We don't support returning longer than 64 bit "
422 "integer values at present.");
426 error.SetErrorString(
427 "We don't support returning complex values at present");
429 llvm::Optional<uint64_t> bit_width =
432 error.SetErrorString(
"can't get type size");
435 if (*bit_width <= 64) {
440 size_t num_bytes = new_value_sp->GetData(data, data_error);
441 if (data_error.
Fail()) {
442 error.SetErrorStringWithFormat(
443 "Couldn't convert return value to raw data: %s",
448 unsigned char buffer[8];
452 f0_value.
SetBytes(buffer, 8, byte_order);
454 set_it_simple =
true;
457 error.SetErrorString(
458 "We don't support returning float values > 64 bits at present");
463 if (!set_it_simple) {
467 error.SetErrorString(
"We only support setting simple integer and float "
468 "return types at present.");
476 ValueObjectSP return_valobj_sp;
479 if (!return_compiler_type)
480 return return_valobj_sp;
487 return return_valobj_sp;
490 if (type_flags & eTypeIsScalar) {
493 bool success =
false;
494 if (type_flags & eTypeIsInteger) {
496 llvm::Optional<uint64_t> byte_size =
499 return return_valobj_sp;
502 const bool is_signed = (type_flags & eTypeIsSigned) != 0;
503 switch (*byte_size) {
507 case sizeof(uint64_t):
509 value.
GetScalar() = (int64_t)(raw_value);
511 value.
GetScalar() = (uint64_t)(raw_value);
525 value.
GetScalar() = (int16_t)(raw_value & UINT16_MAX);
531 case sizeof(uint8_t):
533 value.
GetScalar() = (int8_t)(raw_value & UINT8_MAX);
535 value.
GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
539 }
else if (type_flags & eTypeIsFloat) {
540 if (type_flags & eTypeIsComplex) {
543 llvm::Optional<uint64_t> byte_size =
545 if (byte_size && *byte_size <=
sizeof(
long double)) {
552 if (*byte_size ==
sizeof(
float)) {
555 }
else if (*byte_size ==
sizeof(
double)) {
558 }
else if (*byte_size ==
sizeof(
long double)) {
568 return_valobj_sp = ValueObjectConstResult::Create(
570 }
else if (type_flags & eTypeIsPointer) {
576 return_valobj_sp = ValueObjectConstResult::Create(
580 return return_valobj_sp;
585 ValueObjectSP return_valobj_sp;
587 if (!return_compiler_type)
588 return return_valobj_sp;
591 return_valobj_sp = GetReturnValueObjectSimple(thread, return_compiler_type);
592 if (return_valobj_sp)
593 return return_valobj_sp;
597 return return_valobj_sp;
611 return_valobj_sp = ValueObjectMemory::Create(
612 &thread,
"",
Address(storage_addr,
nullptr), return_compiler_type);
615 return return_valobj_sp;
644 const RegisterInfo *reg_info,
649 if (RegisterIsVolatile(reg_info)) {
658 return !RegisterIsCalleeSaved(reg_info);
667 const char *name = reg_info->name;
668 if (name[0] ==
'r') {
674 return name[2] ==
'\0';
677 if ((name[2] >=
'0' && name[2] <=
'3') || name[2] ==
'5')
678 return name[3] ==
'\0';
685 if (name[0] ==
'f') {
689 return name[2] ==
'\0';
692 if (name[2] >=
'0' && name[2] <=
'5')
693 return name[3] ==
'\0';
702 if (name[0] ==
's' && name[1] ==
'p' && name[2] ==
'\0')
704 if (name[0] ==
'f' && name[1] ==
'p' && name[2] ==
'\0')
706 if (name[0] ==
'p' && name[1] ==
'c' && name[2] ==
'\0')
713 PluginManager::RegisterPlugin(
714 GetPluginNameStatic(),
"System V ABI for s390x targets", CreateInstance);
718 PluginManager::UnregisterPlugin(CreateInstance);