[LLVM][MIPS] Fix FPU Size Based on Dynamic FR.
Reviewers: jingham, clayborg
Subscribers: jaydeep, bhushan, mohit.bhakkad, slthakur, lldb-commits, emaste, nemanjai, labath, sdardis
Differential Revision: https://reviews.llvm.org/D20357
llvm-svn: 277343
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index a14c825..46d6023 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -539,6 +539,7 @@
ConstString set_name;
std::vector<uint32_t> value_regs;
std::vector<uint32_t> invalidate_regs;
+ std::vector<uint8_t> dwarf_opcode_bytes;
RegisterInfo reg_info = { NULL, // Name
NULL, // Alt name
0, // byte size
@@ -553,7 +554,9 @@
reg_num // native register number
},
NULL,
- NULL
+ NULL,
+ NULL, // Dwarf expression opcode bytes pointer
+ 0 // Dwarf expression opcode bytes length
};
while (response.GetNameColonValue(name, value))
@@ -638,6 +641,23 @@
{
SplitCommaSeparatedRegisterNumberString(value, invalidate_regs, 16);
}
+ else if (name.compare("dynamic_size_dwarf_expr_bytes") == 0)
+ {
+ size_t dwarf_opcode_len = value.length () / 2;
+ assert (dwarf_opcode_len > 0);
+
+ dwarf_opcode_bytes.resize (dwarf_opcode_len);
+ StringExtractor opcode_extractor;
+ reg_info.dynamic_size_dwarf_len = dwarf_opcode_len;
+
+ // Swap "value" over into "opcode_extractor"
+ opcode_extractor.GetStringRef ().swap (value);
+ uint32_t ret_val = opcode_extractor.GetHexBytesAvail (dwarf_opcode_bytes.data (),
+ dwarf_opcode_len);
+ assert (dwarf_opcode_len == ret_val);
+
+ reg_info.dynamic_size_dwarf_expr_bytes = dwarf_opcode_bytes.data ();
+ }
}
reg_info.byte_offset = reg_offset;
@@ -4444,6 +4464,7 @@
ConstString set_name;
std::vector<uint32_t> value_regs;
std::vector<uint32_t> invalidate_regs;
+ std::vector<uint8_t> dwarf_opcode_bytes;
bool encoding_set = false;
bool format_set = false;
RegisterInfo reg_info = { NULL, // Name
@@ -4460,10 +4481,12 @@
cur_reg_num // native register number
},
NULL,
- NULL
+ NULL,
+ NULL, // Dwarf Expression opcode bytes pointer
+ 0 // Dwarf Expression opcode bytes length
};
- reg_node.ForEachAttribute([&target_info, &gdb_group, &gdb_type, ®_name, &alt_name, &set_name, &value_regs, &invalidate_regs, &encoding_set, &format_set, ®_info, &cur_reg_num, ®_offset](const llvm::StringRef &name, const llvm::StringRef &value) -> bool {
+ reg_node.ForEachAttribute([&target_info, &gdb_group, &gdb_type, ®_name, &alt_name, &set_name, &value_regs, &invalidate_regs, &encoding_set, &format_set, ®_info, &cur_reg_num, ®_offset, &dwarf_opcode_bytes](const llvm::StringRef &name, const llvm::StringRef &value) -> bool {
if (name == "name")
{
reg_name.SetString(value);
@@ -4551,6 +4574,22 @@
{
SplitCommaSeparatedRegisterNumberString(value, invalidate_regs, 0);
}
+ else if (name == "dynamic_size_dwarf_expr_bytes")
+ {
+ StringExtractor opcode_extractor;
+ std::string opcode_string = value.str ();
+ size_t dwarf_opcode_len = opcode_string.length () / 2;
+ assert (dwarf_opcode_len > 0);
+
+ dwarf_opcode_bytes.resize (dwarf_opcode_len);
+ reg_info.dynamic_size_dwarf_len = dwarf_opcode_len;
+ opcode_extractor.GetStringRef ().swap (opcode_string);
+ uint32_t ret_val = opcode_extractor.GetHexBytesAvail (dwarf_opcode_bytes.data (),
+ dwarf_opcode_len);
+ assert (dwarf_opcode_len == ret_val);
+
+ reg_info.dynamic_size_dwarf_expr_bytes = dwarf_opcode_bytes.data ();
+ }
else
{
printf("unhandled attribute %s = %s\n", name.data(), value.data());