Skip to content

Commit a76290d

Browse files
authored
[lldb] Refactor ReadRegisterValueAsScalar to return an llvm::Error (NFC) (#94556)
1 parent 7573d5e commit a76290d

File tree

1 file changed

+56
-74
lines changed

1 file changed

+56
-74
lines changed

lldb/source/Expression/DWARFExpression.cpp

Lines changed: 56 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -94,51 +94,38 @@ void DWARFExpression::SetRegisterKind(RegisterKind reg_kind) {
9494
m_reg_kind = reg_kind;
9595
}
9696

97-
98-
static bool ReadRegisterValueAsScalar(RegisterContext *reg_ctx,
99-
lldb::RegisterKind reg_kind,
100-
uint32_t reg_num, Status *error_ptr,
101-
Value &value) {
102-
if (reg_ctx == nullptr) {
103-
if (error_ptr)
104-
error_ptr->SetErrorString("No register context in frame.\n");
105-
} else {
106-
uint32_t native_reg =
107-
reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num);
108-
if (native_reg == LLDB_INVALID_REGNUM) {
109-
if (error_ptr)
110-
error_ptr->SetErrorStringWithFormat("Unable to convert register "
111-
"kind=%u reg_num=%u to a native "
112-
"register number.\n",
113-
reg_kind, reg_num);
114-
} else {
115-
const RegisterInfo *reg_info =
116-
reg_ctx->GetRegisterInfoAtIndex(native_reg);
117-
RegisterValue reg_value;
118-
if (reg_ctx->ReadRegister(reg_info, reg_value)) {
119-
if (reg_value.GetScalarValue(value.GetScalar())) {
120-
value.SetValueType(Value::ValueType::Scalar);
121-
value.SetContext(Value::ContextType::RegisterInfo,
122-
const_cast<RegisterInfo *>(reg_info));
123-
if (error_ptr)
124-
error_ptr->Clear();
125-
return true;
126-
} else {
127-
// If we get this error, then we need to implement a value buffer in
128-
// the dwarf expression evaluation function...
129-
if (error_ptr)
130-
error_ptr->SetErrorStringWithFormat(
131-
"register %s can't be converted to a scalar value",
132-
reg_info->name);
133-
}
134-
} else {
135-
if (error_ptr)
136-
error_ptr->SetErrorStringWithFormat("register %s is not available",
137-
reg_info->name);
138-
}
97+
static llvm::Error ReadRegisterValueAsScalar(RegisterContext *reg_ctx,
98+
lldb::RegisterKind reg_kind,
99+
uint32_t reg_num, Value &value) {
100+
if (reg_ctx == nullptr)
101+
return llvm::createStringError("no register context in frame");
102+
103+
const uint32_t native_reg =
104+
reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num);
105+
if (native_reg == LLDB_INVALID_REGNUM)
106+
return llvm::createStringError(
107+
"unable to convert register kind=%u reg_num=%u to a native "
108+
"register number",
109+
reg_kind, reg_num);
110+
111+
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(native_reg);
112+
RegisterValue reg_value;
113+
if (reg_ctx->ReadRegister(reg_info, reg_value)) {
114+
if (reg_value.GetScalarValue(value.GetScalar())) {
115+
value.SetValueType(Value::ValueType::Scalar);
116+
value.SetContext(Value::ContextType::RegisterInfo,
117+
const_cast<RegisterInfo *>(reg_info));
118+
return llvm::Error::success();
139119
}
120+
121+
// If we get this error, then we need to implement a value buffer in
122+
// the dwarf expression evaluation function...
123+
return llvm::createStringError(
124+
"register %s can't be converted to a scalar value", reg_info->name);
140125
}
141-
return false;
126+
127+
return llvm::createStringError("register %s is not available",
128+
reg_info->name);
142129
}
143130

144131
/// Return the length in bytes of the set of operands for \p op. No guarantees
@@ -1832,11 +1819,10 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
18321819
dwarf4_location_description_kind = Register;
18331820
reg_num = op - DW_OP_reg0;
18341821

1835-
Status read_err;
1836-
if (ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, &read_err, tmp))
1837-
stack.push_back(tmp);
1838-
else
1839-
return read_err.ToError();
1822+
if (llvm::Error err =
1823+
ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, tmp))
1824+
return err;
1825+
stack.push_back(tmp);
18401826
} break;
18411827
// OPCODE: DW_OP_regx
18421828
// OPERANDS:
@@ -1846,10 +1832,10 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
18461832
dwarf4_location_description_kind = Register;
18471833
reg_num = opcodes.GetULEB128(&offset);
18481834
Status read_err;
1849-
if (ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, &read_err, tmp))
1850-
stack.push_back(tmp);
1851-
else
1852-
return read_err.ToError();
1835+
if (llvm::Error err =
1836+
ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, tmp))
1837+
return err;
1838+
stack.push_back(tmp);
18531839
} break;
18541840

18551841
// OPCODE: DW_OP_bregN
@@ -1890,17 +1876,15 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
18901876
case DW_OP_breg30:
18911877
case DW_OP_breg31: {
18921878
reg_num = op - DW_OP_breg0;
1893-
1894-
Status read_err;
1895-
if (ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, &read_err,
1896-
tmp)) {
1897-
int64_t breg_offset = opcodes.GetSLEB128(&offset);
1898-
tmp.ResolveValue(exe_ctx) += (uint64_t)breg_offset;
1899-
tmp.ClearContext();
1900-
stack.push_back(tmp);
1901-
stack.back().SetValueType(Value::ValueType::LoadAddress);
1902-
} else
1903-
return read_err.ToError();
1879+
if (llvm::Error err =
1880+
ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, tmp))
1881+
return err;
1882+
1883+
int64_t breg_offset = opcodes.GetSLEB128(&offset);
1884+
tmp.ResolveValue(exe_ctx) += (uint64_t)breg_offset;
1885+
tmp.ClearContext();
1886+
stack.push_back(tmp);
1887+
stack.back().SetValueType(Value::ValueType::LoadAddress);
19041888
} break;
19051889
// OPCODE: DW_OP_bregx
19061890
// OPERANDS: 2
@@ -1910,17 +1894,15 @@ llvm::Expected<Value> DWARFExpression::Evaluate(
19101894
// N plus an offset.
19111895
case DW_OP_bregx: {
19121896
reg_num = opcodes.GetULEB128(&offset);
1913-
1914-
Status read_err;
1915-
if (ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, &read_err,
1916-
tmp)) {
1917-
int64_t breg_offset = opcodes.GetSLEB128(&offset);
1918-
tmp.ResolveValue(exe_ctx) += (uint64_t)breg_offset;
1919-
tmp.ClearContext();
1920-
stack.push_back(tmp);
1921-
stack.back().SetValueType(Value::ValueType::LoadAddress);
1922-
} else
1923-
return read_err.ToError();
1897+
if (llvm::Error err =
1898+
ReadRegisterValueAsScalar(reg_ctx, reg_kind, reg_num, tmp))
1899+
return err;
1900+
1901+
int64_t breg_offset = opcodes.GetSLEB128(&offset);
1902+
tmp.ResolveValue(exe_ctx) += (uint64_t)breg_offset;
1903+
tmp.ClearContext();
1904+
stack.push_back(tmp);
1905+
stack.back().SetValueType(Value::ValueType::LoadAddress);
19241906
} break;
19251907

19261908
case DW_OP_fbreg:

0 commit comments

Comments
 (0)