1 //===-- DynamicRegisterInfo.cpp -------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Target/DynamicRegisterInfo.h" 10 #include "lldb/Core/StreamFile.h" 11 #include "lldb/DataFormatters/FormatManager.h" 12 #include "lldb/Interpreter/OptionArgParser.h" 13 #include "lldb/Utility/ArchSpec.h" 14 #include "lldb/Utility/Log.h" 15 #include "lldb/Utility/RegularExpression.h" 16 #include "lldb/Utility/StringExtractor.h" 17 #include "lldb/Utility/StructuredData.h" 18 19 using namespace lldb; 20 using namespace lldb_private; 21 22 DynamicRegisterInfo::DynamicRegisterInfo( 23 const lldb_private::StructuredData::Dictionary &dict, 24 const lldb_private::ArchSpec &arch) { 25 SetRegisterInfo(dict, arch); 26 } 27 28 DynamicRegisterInfo::DynamicRegisterInfo(DynamicRegisterInfo &&info) { 29 MoveFrom(std::move(info)); 30 } 31 32 DynamicRegisterInfo & 33 DynamicRegisterInfo::operator=(DynamicRegisterInfo &&info) { 34 MoveFrom(std::move(info)); 35 return *this; 36 } 37 38 void DynamicRegisterInfo::MoveFrom(DynamicRegisterInfo &&info) { 39 m_regs = std::move(info.m_regs); 40 m_sets = std::move(info.m_sets); 41 m_set_reg_nums = std::move(info.m_set_reg_nums); 42 m_set_names = std::move(info.m_set_names); 43 m_value_regs_map = std::move(info.m_value_regs_map); 44 m_invalidate_regs_map = std::move(info.m_invalidate_regs_map); 45 46 m_reg_data_byte_size = info.m_reg_data_byte_size; 47 m_finalized = info.m_finalized; 48 49 if (m_finalized) { 50 const size_t num_sets = m_sets.size(); 51 for (size_t set = 0; set < num_sets; ++set) 52 m_sets[set].registers = m_set_reg_nums[set].data(); 53 } 54 55 info.Clear(); 56 } 57 58 llvm::Expected<uint32_t> DynamicRegisterInfo::ByteOffsetFromSlice( 59 uint32_t index, llvm::StringRef slice_str, lldb::ByteOrder byte_order) { 60 // Slices use the following format: 61 // REGNAME[MSBIT:LSBIT] 62 // REGNAME - name of the register to grab a slice of 63 // MSBIT - the most significant bit at which the current register value 64 // starts at 65 // LSBIT - the least significant bit at which the current register value 66 // ends at 67 static llvm::Regex g_bitfield_regex( 68 "([A-Za-z_][A-Za-z0-9_]*)\\[([0-9]+):([0-9]+)\\]"); 69 llvm::SmallVector<llvm::StringRef, 4> matches; 70 if (!g_bitfield_regex.match(slice_str, &matches)) 71 return llvm::createStringError( 72 llvm::inconvertibleErrorCode(), 73 "failed to match against register bitfield regex (slice: %s)", 74 slice_str.str().c_str()); 75 76 llvm::StringRef reg_name_str = matches[1]; 77 llvm::StringRef msbit_str = matches[2]; 78 llvm::StringRef lsbit_str = matches[3]; 79 uint32_t msbit; 80 uint32_t lsbit; 81 if (!llvm::to_integer(msbit_str, msbit) || 82 !llvm::to_integer(lsbit_str, lsbit)) 83 return llvm::createStringError( 84 llvm::inconvertibleErrorCode(), "msbit (%s) or lsbit (%s) are invalid", 85 msbit_str.str().c_str(), lsbit_str.str().c_str()); 86 87 if (msbit <= lsbit) 88 return llvm::createStringError(llvm::inconvertibleErrorCode(), 89 "msbit (%u) must be greater than lsbit (%u)", 90 msbit, lsbit); 91 92 const uint32_t msbyte = msbit / 8; 93 const uint32_t lsbyte = lsbit / 8; 94 95 const RegisterInfo *containing_reg_info = GetRegisterInfo(reg_name_str); 96 if (!containing_reg_info) 97 return llvm::createStringError(llvm::inconvertibleErrorCode(), 98 "invalid concrete register \"%s\"", 99 reg_name_str.str().c_str()); 100 101 const uint32_t max_bit = containing_reg_info->byte_size * 8; 102 103 if (msbit > max_bit) 104 return llvm::createStringError( 105 llvm::inconvertibleErrorCode(), 106 "msbit (%u) must be less than the bitsize of the register \"%s\" (%u)", 107 msbit, reg_name_str.str().c_str(), max_bit); 108 if (lsbit > max_bit) 109 return llvm::createStringError( 110 llvm::inconvertibleErrorCode(), 111 "lsbit (%u) must be less than the bitsize of the register \"%s\" (%u)", 112 lsbit, reg_name_str.str().c_str(), max_bit); 113 114 m_invalidate_regs_map[containing_reg_info->kinds[eRegisterKindLLDB]] 115 .push_back(index); 116 m_value_regs_map[index].push_back( 117 containing_reg_info->kinds[eRegisterKindLLDB]); 118 m_invalidate_regs_map[index].push_back( 119 containing_reg_info->kinds[eRegisterKindLLDB]); 120 121 if (byte_order == eByteOrderLittle) 122 return containing_reg_info->byte_offset + lsbyte; 123 if (byte_order == eByteOrderBig) 124 return containing_reg_info->byte_offset + msbyte; 125 llvm_unreachable("Invalid byte order"); 126 } 127 128 llvm::Expected<uint32_t> DynamicRegisterInfo::ByteOffsetFromComposite( 129 uint32_t index, StructuredData::Array &composite_reg_list, 130 lldb::ByteOrder byte_order) { 131 const size_t num_composite_regs = composite_reg_list.GetSize(); 132 if (num_composite_regs == 0) 133 return llvm::createStringError(llvm::inconvertibleErrorCode(), 134 "\"composite\" list is empty"); 135 136 uint32_t composite_offset = UINT32_MAX; 137 for (uint32_t composite_idx = 0; composite_idx < num_composite_regs; 138 ++composite_idx) { 139 ConstString composite_reg_name; 140 if (!composite_reg_list.GetItemAtIndexAsString(composite_idx, 141 composite_reg_name, nullptr)) 142 return llvm::createStringError( 143 llvm::inconvertibleErrorCode(), 144 "\"composite\" list value is not a Python string at index %d", 145 composite_idx); 146 147 const RegisterInfo *composite_reg_info = 148 GetRegisterInfo(composite_reg_name.GetStringRef()); 149 if (!composite_reg_info) 150 return llvm::createStringError( 151 llvm::inconvertibleErrorCode(), 152 "failed to find composite register by name: \"%s\"", 153 composite_reg_name.GetCString()); 154 155 composite_offset = 156 std::min(composite_offset, composite_reg_info->byte_offset); 157 m_value_regs_map[index].push_back( 158 composite_reg_info->kinds[eRegisterKindLLDB]); 159 m_invalidate_regs_map[composite_reg_info->kinds[eRegisterKindLLDB]] 160 .push_back(index); 161 m_invalidate_regs_map[index].push_back( 162 composite_reg_info->kinds[eRegisterKindLLDB]); 163 } 164 165 return composite_offset; 166 } 167 168 llvm::Expected<uint32_t> DynamicRegisterInfo::ByteOffsetFromRegInfoDict( 169 uint32_t index, StructuredData::Dictionary ®_info_dict, 170 lldb::ByteOrder byte_order) { 171 uint32_t byte_offset; 172 if (reg_info_dict.GetValueForKeyAsInteger("offset", byte_offset)) 173 return byte_offset; 174 175 // No offset for this register, see if the register has a value 176 // expression which indicates this register is part of another register. 177 // Value expressions are things like "rax[31:0]" which state that the 178 // current register's value is in a concrete register "rax" in bits 31:0. 179 // If there is a value expression we can calculate the offset 180 llvm::StringRef slice_str; 181 if (reg_info_dict.GetValueForKeyAsString("slice", slice_str, nullptr)) 182 return ByteOffsetFromSlice(index, slice_str, byte_order); 183 184 StructuredData::Array *composite_reg_list; 185 if (reg_info_dict.GetValueForKeyAsArray("composite", composite_reg_list)) 186 return ByteOffsetFromComposite(index, *composite_reg_list, byte_order); 187 188 return llvm::createStringError(llvm::inconvertibleErrorCode(), 189 "insufficient data to calculate byte offset"); 190 } 191 192 size_t 193 DynamicRegisterInfo::SetRegisterInfo(const StructuredData::Dictionary &dict, 194 const ArchSpec &arch) { 195 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT); 196 assert(!m_finalized); 197 StructuredData::Array *sets = nullptr; 198 if (dict.GetValueForKeyAsArray("sets", sets)) { 199 const uint32_t num_sets = sets->GetSize(); 200 for (uint32_t i = 0; i < num_sets; ++i) { 201 ConstString set_name; 202 if (sets->GetItemAtIndexAsString(i, set_name) && !set_name.IsEmpty()) { 203 m_sets.push_back({set_name.AsCString(), nullptr, 0, nullptr}); 204 } else { 205 Clear(); 206 printf("error: register sets must have valid names\n"); 207 return 0; 208 } 209 } 210 m_set_reg_nums.resize(m_sets.size()); 211 } 212 213 StructuredData::Array *regs = nullptr; 214 if (!dict.GetValueForKeyAsArray("registers", regs)) 215 return 0; 216 217 const ByteOrder byte_order = arch.GetByteOrder(); 218 219 const uint32_t num_regs = regs->GetSize(); 220 // typedef std::map<std::string, std::vector<std::string> > 221 // InvalidateNameMap; 222 // InvalidateNameMap invalidate_map; 223 for (uint32_t i = 0; i < num_regs; ++i) { 224 StructuredData::Dictionary *reg_info_dict = nullptr; 225 if (!regs->GetItemAtIndexAsDictionary(i, reg_info_dict)) { 226 Clear(); 227 printf("error: items in the 'registers' array must be dictionaries\n"); 228 regs->DumpToStdout(); 229 return 0; 230 } 231 232 // { 'name':'rcx' , 'bitsize' : 64, 'offset' : 16, 233 // 'encoding':'uint' , 'format':'hex' , 'set': 0, 'ehframe' : 2, 234 // 'dwarf' : 2, 'generic':'arg4', 'alt-name':'arg4', }, 235 RegisterInfo reg_info; 236 std::vector<uint32_t> value_regs; 237 std::vector<uint32_t> invalidate_regs; 238 memset(®_info, 0, sizeof(reg_info)); 239 240 ConstString name_val; 241 ConstString alt_name_val; 242 if (!reg_info_dict->GetValueForKeyAsString("name", name_val, nullptr)) { 243 Clear(); 244 printf("error: registers must have valid names and offsets\n"); 245 reg_info_dict->DumpToStdout(); 246 return 0; 247 } 248 reg_info.name = name_val.GetCString(); 249 reg_info_dict->GetValueForKeyAsString("alt-name", alt_name_val, nullptr); 250 reg_info.alt_name = alt_name_val.GetCString(); 251 252 llvm::Expected<uint32_t> byte_offset = 253 ByteOffsetFromRegInfoDict(i, *reg_info_dict, byte_order); 254 if (byte_offset) 255 reg_info.byte_offset = byte_offset.get(); 256 else { 257 LLDB_LOG_ERROR(log, byte_offset.takeError(), 258 "error while parsing register {1}: {0}", reg_info.name); 259 Clear(); 260 reg_info_dict->DumpToStdout(); 261 return 0; 262 } 263 264 int64_t bitsize = 0; 265 if (!reg_info_dict->GetValueForKeyAsInteger("bitsize", bitsize)) { 266 Clear(); 267 printf("error: invalid or missing 'bitsize' key/value pair in register " 268 "dictionary\n"); 269 reg_info_dict->DumpToStdout(); 270 return 0; 271 } 272 273 reg_info.byte_size = bitsize / 8; 274 275 llvm::StringRef format_str; 276 if (reg_info_dict->GetValueForKeyAsString("format", format_str, nullptr)) { 277 if (OptionArgParser::ToFormat(format_str.str().c_str(), reg_info.format, 278 nullptr) 279 .Fail()) { 280 Clear(); 281 printf("error: invalid 'format' value in register dictionary\n"); 282 reg_info_dict->DumpToStdout(); 283 return 0; 284 } 285 } else { 286 reg_info_dict->GetValueForKeyAsInteger("format", reg_info.format, 287 eFormatHex); 288 } 289 290 llvm::StringRef encoding_str; 291 if (reg_info_dict->GetValueForKeyAsString("encoding", encoding_str)) 292 reg_info.encoding = Args::StringToEncoding(encoding_str, eEncodingUint); 293 else 294 reg_info_dict->GetValueForKeyAsInteger("encoding", reg_info.encoding, 295 eEncodingUint); 296 297 size_t set = 0; 298 if (!reg_info_dict->GetValueForKeyAsInteger<size_t>("set", set, -1) || 299 set >= m_sets.size()) { 300 Clear(); 301 printf("error: invalid 'set' value in register dictionary, valid values " 302 "are 0 - %i\n", 303 (int)set); 304 reg_info_dict->DumpToStdout(); 305 return 0; 306 } 307 308 // Fill in the register numbers 309 reg_info.kinds[lldb::eRegisterKindLLDB] = i; 310 reg_info.kinds[lldb::eRegisterKindProcessPlugin] = i; 311 uint32_t eh_frame_regno = LLDB_INVALID_REGNUM; 312 reg_info_dict->GetValueForKeyAsInteger("gcc", eh_frame_regno, 313 LLDB_INVALID_REGNUM); 314 if (eh_frame_regno == LLDB_INVALID_REGNUM) 315 reg_info_dict->GetValueForKeyAsInteger("ehframe", eh_frame_regno, 316 LLDB_INVALID_REGNUM); 317 reg_info.kinds[lldb::eRegisterKindEHFrame] = eh_frame_regno; 318 reg_info_dict->GetValueForKeyAsInteger( 319 "dwarf", reg_info.kinds[lldb::eRegisterKindDWARF], LLDB_INVALID_REGNUM); 320 llvm::StringRef generic_str; 321 if (reg_info_dict->GetValueForKeyAsString("generic", generic_str)) 322 reg_info.kinds[lldb::eRegisterKindGeneric] = 323 Args::StringToGenericRegister(generic_str); 324 else 325 reg_info_dict->GetValueForKeyAsInteger( 326 "generic", reg_info.kinds[lldb::eRegisterKindGeneric], 327 LLDB_INVALID_REGNUM); 328 329 // Check if this register invalidates any other register values when it is 330 // modified 331 StructuredData::Array *invalidate_reg_list = nullptr; 332 if (reg_info_dict->GetValueForKeyAsArray("invalidate-regs", 333 invalidate_reg_list)) { 334 const size_t num_regs = invalidate_reg_list->GetSize(); 335 if (num_regs > 0) { 336 for (uint32_t idx = 0; idx < num_regs; ++idx) { 337 ConstString invalidate_reg_name; 338 uint64_t invalidate_reg_num; 339 if (invalidate_reg_list->GetItemAtIndexAsString( 340 idx, invalidate_reg_name)) { 341 const RegisterInfo *invalidate_reg_info = 342 GetRegisterInfo(invalidate_reg_name.GetStringRef()); 343 if (invalidate_reg_info) { 344 m_invalidate_regs_map[i].push_back( 345 invalidate_reg_info->kinds[eRegisterKindLLDB]); 346 } else { 347 // TODO: print error invalid slice string that doesn't follow the 348 // format 349 printf("error: failed to find a 'invalidate-regs' register for " 350 "\"%s\" while parsing register \"%s\"\n", 351 invalidate_reg_name.GetCString(), reg_info.name); 352 } 353 } else if (invalidate_reg_list->GetItemAtIndexAsInteger( 354 idx, invalidate_reg_num)) { 355 if (invalidate_reg_num != UINT64_MAX) 356 m_invalidate_regs_map[i].push_back(invalidate_reg_num); 357 else 358 printf("error: 'invalidate-regs' list value wasn't a valid " 359 "integer\n"); 360 } else { 361 printf("error: 'invalidate-regs' list value wasn't a python string " 362 "or integer\n"); 363 } 364 } 365 } else { 366 printf("error: 'invalidate-regs' contained an empty list\n"); 367 } 368 } 369 370 // Calculate the register offset 371 const size_t end_reg_offset = reg_info.byte_offset + reg_info.byte_size; 372 if (m_reg_data_byte_size < end_reg_offset) 373 m_reg_data_byte_size = end_reg_offset; 374 375 m_regs.push_back(reg_info); 376 m_set_reg_nums[set].push_back(i); 377 } 378 Finalize(arch); 379 return m_regs.size(); 380 } 381 382 void DynamicRegisterInfo::AddRegister(RegisterInfo reg_info, 383 ConstString &set_name) { 384 assert(!m_finalized); 385 const uint32_t reg_num = m_regs.size(); 386 assert(reg_info.name); 387 uint32_t i; 388 if (reg_info.value_regs) { 389 for (i = 0; reg_info.value_regs[i] != LLDB_INVALID_REGNUM; ++i) 390 m_value_regs_map[reg_num].push_back(reg_info.value_regs[i]); 391 392 // invalidate until Finalize() is called 393 reg_info.value_regs = nullptr; 394 } 395 if (reg_info.invalidate_regs) { 396 for (i = 0; reg_info.invalidate_regs[i] != LLDB_INVALID_REGNUM; ++i) 397 m_invalidate_regs_map[reg_num].push_back(reg_info.invalidate_regs[i]); 398 399 // invalidate until Finalize() is called 400 reg_info.invalidate_regs = nullptr; 401 } 402 403 m_regs.push_back(reg_info); 404 uint32_t set = GetRegisterSetIndexByName(set_name, true); 405 assert(set < m_sets.size()); 406 assert(set < m_set_reg_nums.size()); 407 assert(set < m_set_names.size()); 408 m_set_reg_nums[set].push_back(reg_num); 409 } 410 411 void DynamicRegisterInfo::AddSupplementaryRegister(RegisterInfo new_reg_info, 412 ConstString &set_name) { 413 assert(new_reg_info.value_regs != nullptr); 414 const uint32_t reg_num = m_regs.size(); 415 AddRegister(new_reg_info, set_name); 416 417 reg_to_regs_map new_invalidates; 418 for (uint32_t value_reg : m_value_regs_map[reg_num]) { 419 // copy value_regs to invalidate_regs 420 new_invalidates[reg_num].push_back(value_reg); 421 422 // copy invalidate_regs from the parent register 423 llvm::append_range(new_invalidates[reg_num], m_invalidate_regs_map[value_reg]); 424 425 // add reverse invalidate entries 426 for (uint32_t x : new_invalidates[reg_num]) 427 new_invalidates[x].push_back(new_reg_info.kinds[eRegisterKindLLDB]); 428 } 429 430 for (const auto &x : new_invalidates) 431 llvm::append_range(m_invalidate_regs_map[x.first], x.second); 432 } 433 434 void DynamicRegisterInfo::Finalize(const ArchSpec &arch) { 435 if (m_finalized) 436 return; 437 438 m_finalized = true; 439 const size_t num_sets = m_sets.size(); 440 for (size_t set = 0; set < num_sets; ++set) { 441 assert(m_sets.size() == m_set_reg_nums.size()); 442 m_sets[set].num_registers = m_set_reg_nums[set].size(); 443 m_sets[set].registers = m_set_reg_nums[set].data(); 444 } 445 446 // sort and unique all value registers and make sure each is terminated with 447 // LLDB_INVALID_REGNUM 448 449 for (reg_to_regs_map::iterator pos = m_value_regs_map.begin(), 450 end = m_value_regs_map.end(); 451 pos != end; ++pos) { 452 if (pos->second.size() > 1) { 453 llvm::sort(pos->second.begin(), pos->second.end()); 454 reg_num_collection::iterator unique_end = 455 std::unique(pos->second.begin(), pos->second.end()); 456 if (unique_end != pos->second.end()) 457 pos->second.erase(unique_end, pos->second.end()); 458 } 459 assert(!pos->second.empty()); 460 if (pos->second.back() != LLDB_INVALID_REGNUM) 461 pos->second.push_back(LLDB_INVALID_REGNUM); 462 } 463 464 // Now update all value_regs with each register info as needed 465 const size_t num_regs = m_regs.size(); 466 for (size_t i = 0; i < num_regs; ++i) { 467 if (m_value_regs_map.find(i) != m_value_regs_map.end()) 468 m_regs[i].value_regs = m_value_regs_map[i].data(); 469 else 470 m_regs[i].value_regs = nullptr; 471 } 472 473 // Expand all invalidation dependencies 474 for (reg_to_regs_map::iterator pos = m_invalidate_regs_map.begin(), 475 end = m_invalidate_regs_map.end(); 476 pos != end; ++pos) { 477 const uint32_t reg_num = pos->first; 478 479 if (m_regs[reg_num].value_regs) { 480 reg_num_collection extra_invalid_regs; 481 for (const uint32_t invalidate_reg_num : pos->second) { 482 reg_to_regs_map::iterator invalidate_pos = 483 m_invalidate_regs_map.find(invalidate_reg_num); 484 if (invalidate_pos != m_invalidate_regs_map.end()) { 485 for (const uint32_t concrete_invalidate_reg_num : 486 invalidate_pos->second) { 487 if (concrete_invalidate_reg_num != reg_num) 488 extra_invalid_regs.push_back(concrete_invalidate_reg_num); 489 } 490 } 491 } 492 pos->second.insert(pos->second.end(), extra_invalid_regs.begin(), 493 extra_invalid_regs.end()); 494 } 495 } 496 497 // sort and unique all invalidate registers and make sure each is terminated 498 // with LLDB_INVALID_REGNUM 499 for (reg_to_regs_map::iterator pos = m_invalidate_regs_map.begin(), 500 end = m_invalidate_regs_map.end(); 501 pos != end; ++pos) { 502 if (pos->second.size() > 1) { 503 llvm::sort(pos->second.begin(), pos->second.end()); 504 reg_num_collection::iterator unique_end = 505 std::unique(pos->second.begin(), pos->second.end()); 506 if (unique_end != pos->second.end()) 507 pos->second.erase(unique_end, pos->second.end()); 508 } 509 assert(!pos->second.empty()); 510 if (pos->second.back() != LLDB_INVALID_REGNUM) 511 pos->second.push_back(LLDB_INVALID_REGNUM); 512 } 513 514 // Now update all invalidate_regs with each register info as needed 515 for (size_t i = 0; i < num_regs; ++i) { 516 if (m_invalidate_regs_map.find(i) != m_invalidate_regs_map.end()) 517 m_regs[i].invalidate_regs = m_invalidate_regs_map[i].data(); 518 else 519 m_regs[i].invalidate_regs = nullptr; 520 } 521 522 // Check if we need to automatically set the generic registers in case they 523 // weren't set 524 bool generic_regs_specified = false; 525 for (const auto ® : m_regs) { 526 if (reg.kinds[eRegisterKindGeneric] != LLDB_INVALID_REGNUM) { 527 generic_regs_specified = true; 528 break; 529 } 530 } 531 532 if (!generic_regs_specified) { 533 switch (arch.GetMachine()) { 534 case llvm::Triple::aarch64: 535 case llvm::Triple::aarch64_32: 536 case llvm::Triple::aarch64_be: 537 for (auto ® : m_regs) { 538 if (strcmp(reg.name, "pc") == 0) 539 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; 540 else if ((strcmp(reg.name, "fp") == 0) || 541 (strcmp(reg.name, "x29") == 0)) 542 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; 543 else if ((strcmp(reg.name, "lr") == 0) || 544 (strcmp(reg.name, "x30") == 0)) 545 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; 546 else if ((strcmp(reg.name, "sp") == 0) || 547 (strcmp(reg.name, "x31") == 0)) 548 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; 549 else if (strcmp(reg.name, "cpsr") == 0) 550 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; 551 } 552 break; 553 554 case llvm::Triple::arm: 555 case llvm::Triple::armeb: 556 case llvm::Triple::thumb: 557 case llvm::Triple::thumbeb: 558 for (auto ® : m_regs) { 559 if ((strcmp(reg.name, "pc") == 0) || (strcmp(reg.name, "r15") == 0)) 560 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; 561 else if ((strcmp(reg.name, "sp") == 0) || 562 (strcmp(reg.name, "r13") == 0)) 563 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; 564 else if ((strcmp(reg.name, "lr") == 0) || 565 (strcmp(reg.name, "r14") == 0)) 566 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; 567 else if ((strcmp(reg.name, "r7") == 0) && 568 arch.GetTriple().getVendor() == llvm::Triple::Apple) 569 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; 570 else if ((strcmp(reg.name, "r11") == 0) && 571 arch.GetTriple().getVendor() != llvm::Triple::Apple) 572 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; 573 else if (strcmp(reg.name, "fp") == 0) 574 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; 575 else if (strcmp(reg.name, "cpsr") == 0) 576 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; 577 } 578 break; 579 580 case llvm::Triple::x86: 581 for (auto ® : m_regs) { 582 if ((strcmp(reg.name, "eip") == 0) || (strcmp(reg.name, "pc") == 0)) 583 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; 584 else if ((strcmp(reg.name, "esp") == 0) || 585 (strcmp(reg.name, "sp") == 0)) 586 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; 587 else if ((strcmp(reg.name, "ebp") == 0) || 588 (strcmp(reg.name, "fp") == 0)) 589 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; 590 else if ((strcmp(reg.name, "eflags") == 0) || 591 (strcmp(reg.name, "flags") == 0)) 592 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; 593 } 594 break; 595 596 case llvm::Triple::x86_64: 597 for (auto ® : m_regs) { 598 if ((strcmp(reg.name, "rip") == 0) || (strcmp(reg.name, "pc") == 0)) 599 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; 600 else if ((strcmp(reg.name, "rsp") == 0) || 601 (strcmp(reg.name, "sp") == 0)) 602 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; 603 else if ((strcmp(reg.name, "rbp") == 0) || 604 (strcmp(reg.name, "fp") == 0)) 605 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; 606 else if ((strcmp(reg.name, "rflags") == 0) || 607 (strcmp(reg.name, "eflags") == 0) || 608 (strcmp(reg.name, "flags") == 0)) 609 reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; 610 } 611 break; 612 613 default: 614 break; 615 } 616 } 617 618 // At this stage call ConfigureOffsets to calculate register offsets for 619 // targets supporting dynamic offset calculation. It also calculates 620 // total byte size of register data. 621 ConfigureOffsets(); 622 623 // Check if register info is reconfigurable 624 // AArch64 SVE register set has configurable register sizes 625 if (arch.GetTriple().isAArch64()) { 626 for (const auto ® : m_regs) { 627 if (strcmp(reg.name, "vg") == 0) { 628 m_is_reconfigurable = true; 629 break; 630 } 631 } 632 } 633 } 634 635 void DynamicRegisterInfo::ConfigureOffsets() { 636 // We are going to create a map between remote (eRegisterKindProcessPlugin) 637 // and local (eRegisterKindLLDB) register numbers. This map will give us 638 // remote register numbers in increasing order for offset calculation. 639 std::map<uint32_t, uint32_t> remote_to_local_regnum_map; 640 for (const auto ® : m_regs) 641 remote_to_local_regnum_map[reg.kinds[eRegisterKindProcessPlugin]] = 642 reg.kinds[eRegisterKindLLDB]; 643 644 // At this stage we manually calculate g/G packet offsets of all primary 645 // registers, only if target XML or qRegisterInfo packet did not send 646 // an offset explicitly. 647 uint32_t reg_offset = 0; 648 for (auto const ®num_pair : remote_to_local_regnum_map) { 649 if (m_regs[regnum_pair.second].byte_offset == LLDB_INVALID_INDEX32 && 650 m_regs[regnum_pair.second].value_regs == nullptr) { 651 m_regs[regnum_pair.second].byte_offset = reg_offset; 652 653 reg_offset = m_regs[regnum_pair.second].byte_offset + 654 m_regs[regnum_pair.second].byte_size; 655 } 656 } 657 658 // Now update all value_regs with each register info as needed 659 for (auto ® : m_regs) { 660 if (reg.value_regs != nullptr) { 661 // Assign a valid offset to all pseudo registers if not assigned by stub. 662 // Pseudo registers with value_regs list populated will share same offset 663 // as that of their corresponding primary register in value_regs list. 664 if (reg.byte_offset == LLDB_INVALID_INDEX32) { 665 uint32_t value_regnum = reg.value_regs[0]; 666 if (value_regnum != LLDB_INVALID_INDEX32) 667 reg.byte_offset = GetRegisterInfoAtIndex(value_regnum)->byte_offset; 668 } 669 } 670 671 reg_offset = reg.byte_offset + reg.byte_size; 672 if (m_reg_data_byte_size < reg_offset) 673 m_reg_data_byte_size = reg_offset; 674 } 675 } 676 677 bool DynamicRegisterInfo::IsReconfigurable() { return m_is_reconfigurable; } 678 679 size_t DynamicRegisterInfo::GetNumRegisters() const { return m_regs.size(); } 680 681 size_t DynamicRegisterInfo::GetNumRegisterSets() const { return m_sets.size(); } 682 683 size_t DynamicRegisterInfo::GetRegisterDataByteSize() const { 684 return m_reg_data_byte_size; 685 } 686 687 const RegisterInfo * 688 DynamicRegisterInfo::GetRegisterInfoAtIndex(uint32_t i) const { 689 if (i < m_regs.size()) 690 return &m_regs[i]; 691 return nullptr; 692 } 693 694 const RegisterInfo *DynamicRegisterInfo::GetRegisterInfo(uint32_t kind, 695 uint32_t num) const { 696 uint32_t reg_index = ConvertRegisterKindToRegisterNumber(kind, num); 697 if (reg_index != LLDB_INVALID_REGNUM) 698 return &m_regs[reg_index]; 699 return nullptr; 700 } 701 702 const RegisterSet *DynamicRegisterInfo::GetRegisterSet(uint32_t i) const { 703 if (i < m_sets.size()) 704 return &m_sets[i]; 705 return nullptr; 706 } 707 708 uint32_t DynamicRegisterInfo::GetRegisterSetIndexByName(ConstString &set_name, 709 bool can_create) { 710 name_collection::iterator pos, end = m_set_names.end(); 711 for (pos = m_set_names.begin(); pos != end; ++pos) { 712 if (*pos == set_name) 713 return std::distance(m_set_names.begin(), pos); 714 } 715 716 m_set_names.push_back(set_name); 717 m_set_reg_nums.resize(m_set_reg_nums.size() + 1); 718 RegisterSet new_set = {set_name.AsCString(), nullptr, 0, nullptr}; 719 m_sets.push_back(new_set); 720 return m_sets.size() - 1; 721 } 722 723 uint32_t 724 DynamicRegisterInfo::ConvertRegisterKindToRegisterNumber(uint32_t kind, 725 uint32_t num) const { 726 reg_collection::const_iterator pos, end = m_regs.end(); 727 for (pos = m_regs.begin(); pos != end; ++pos) { 728 if (pos->kinds[kind] == num) 729 return std::distance(m_regs.begin(), pos); 730 } 731 732 return LLDB_INVALID_REGNUM; 733 } 734 735 void DynamicRegisterInfo::Clear() { 736 m_regs.clear(); 737 m_sets.clear(); 738 m_set_reg_nums.clear(); 739 m_set_names.clear(); 740 m_value_regs_map.clear(); 741 m_invalidate_regs_map.clear(); 742 m_reg_data_byte_size = 0; 743 m_finalized = false; 744 } 745 746 void DynamicRegisterInfo::Dump() const { 747 StreamFile s(stdout, false); 748 const size_t num_regs = m_regs.size(); 749 s.Printf("%p: DynamicRegisterInfo contains %" PRIu64 " registers:\n", 750 static_cast<const void *>(this), static_cast<uint64_t>(num_regs)); 751 for (size_t i = 0; i < num_regs; ++i) { 752 s.Printf("[%3" PRIu64 "] name = %-10s", (uint64_t)i, m_regs[i].name); 753 s.Printf(", size = %2u, offset = %4u, encoding = %u, format = %-10s", 754 m_regs[i].byte_size, m_regs[i].byte_offset, m_regs[i].encoding, 755 FormatManager::GetFormatAsCString(m_regs[i].format)); 756 if (m_regs[i].kinds[eRegisterKindProcessPlugin] != LLDB_INVALID_REGNUM) 757 s.Printf(", process plugin = %3u", 758 m_regs[i].kinds[eRegisterKindProcessPlugin]); 759 if (m_regs[i].kinds[eRegisterKindDWARF] != LLDB_INVALID_REGNUM) 760 s.Printf(", dwarf = %3u", m_regs[i].kinds[eRegisterKindDWARF]); 761 if (m_regs[i].kinds[eRegisterKindEHFrame] != LLDB_INVALID_REGNUM) 762 s.Printf(", ehframe = %3u", m_regs[i].kinds[eRegisterKindEHFrame]); 763 if (m_regs[i].kinds[eRegisterKindGeneric] != LLDB_INVALID_REGNUM) 764 s.Printf(", generic = %3u", m_regs[i].kinds[eRegisterKindGeneric]); 765 if (m_regs[i].alt_name) 766 s.Printf(", alt-name = %s", m_regs[i].alt_name); 767 if (m_regs[i].value_regs) { 768 s.Printf(", value_regs = [ "); 769 for (size_t j = 0; m_regs[i].value_regs[j] != LLDB_INVALID_REGNUM; ++j) { 770 s.Printf("%s ", m_regs[m_regs[i].value_regs[j]].name); 771 } 772 s.Printf("]"); 773 } 774 if (m_regs[i].invalidate_regs) { 775 s.Printf(", invalidate_regs = [ "); 776 for (size_t j = 0; m_regs[i].invalidate_regs[j] != LLDB_INVALID_REGNUM; 777 ++j) { 778 s.Printf("%s ", m_regs[m_regs[i].invalidate_regs[j]].name); 779 } 780 s.Printf("]"); 781 } 782 s.EOL(); 783 } 784 785 const size_t num_sets = m_sets.size(); 786 s.Printf("%p: DynamicRegisterInfo contains %" PRIu64 " register sets:\n", 787 static_cast<const void *>(this), static_cast<uint64_t>(num_sets)); 788 for (size_t i = 0; i < num_sets; ++i) { 789 s.Printf("set[%" PRIu64 "] name = %s, regs = [", (uint64_t)i, 790 m_sets[i].name); 791 for (size_t idx = 0; idx < m_sets[i].num_registers; ++idx) { 792 s.Printf("%s ", m_regs[m_sets[i].registers[idx]].name); 793 } 794 s.Printf("]\n"); 795 } 796 } 797 798 const lldb_private::RegisterInfo * 799 DynamicRegisterInfo::GetRegisterInfo(llvm::StringRef reg_name) const { 800 for (auto ®_info : m_regs) 801 if (reg_info.name == reg_name) 802 return ®_info; 803 return nullptr; 804 } 805