Skip to content

Commit

Permalink
Merge pull request iovisor#3991 from maqiao-mq/bugfix
Browse files Browse the repository at this point in the history
bcc/usdt: fix parse double-reg-indirect addressing mode in arguments …
  • Loading branch information
davemarchevsky authored May 20, 2022
2 parents 3008c28 + 605a6e7 commit bc810d5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 14 deletions.
3 changes: 1 addition & 2 deletions src/cc/usdt.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,7 @@ class ArgumentParser_aarch64 : public ArgumentParser {
private:
bool parse_register(ssize_t pos, ssize_t &new_pos, std::string &reg_name);
bool parse_size(ssize_t pos, ssize_t &new_pos, optional<int> *arg_size);
bool parse_mem(ssize_t pos, ssize_t &new_pos, std::string &reg_name,
optional<int> *offset);
bool parse_mem(ssize_t pos, ssize_t &new_pos, Argument *dest);

public:
bool parse(Argument *dest);
Expand Down
32 changes: 20 additions & 12 deletions src/cc/usdt/usdt_args.cc
Original file line number Diff line number Diff line change
Expand Up @@ -190,16 +190,27 @@ bool ArgumentParser_aarch64::parse_size(ssize_t pos, ssize_t &new_pos,
}

bool ArgumentParser_aarch64::parse_mem(ssize_t pos, ssize_t &new_pos,
std::string &reg_name,
optional<int> *offset) {
if (parse_register(pos, new_pos, reg_name) == false)
Argument *dest) {
std::string base_reg_name, index_reg_name;

if (parse_register(pos, new_pos, base_reg_name) == false)
return false;
dest->base_register_name_ = base_reg_name;

if (arg_[new_pos] == ',') {
pos = new_pos + 1;
new_pos = parse_number(pos, offset);
if (new_pos == pos)
return error_return(pos, pos);
new_pos = parse_number(pos, &dest->deref_offset_);
if (new_pos == pos) {
// offset isn't a number, so it should be a reg,
// which looks like: -1@[x0, x1], rather than -1@[x0, 24]
skip_whitespace_from(pos);
pos = cur_pos_;
if (parse_register(pos, new_pos, index_reg_name) == false)
return error_return(pos, pos);
dest->index_register_name_ = index_reg_name;
dest->scale_ = 1;
dest->deref_offset_ = 0;
}
}
if (arg_[new_pos] != ']')
return error_return(new_pos, new_pos);
Expand All @@ -214,6 +225,7 @@ bool ArgumentParser_aarch64::parse(Argument *dest) {
// Support the following argument patterns:
// [-]<size>@<value>, [-]<size>@<reg>, [-]<size>@[<reg>], or
// [-]<size>@[<reg>,<offset>]
// [-]<size>@[<reg>,<index_reg>]
ssize_t cur_pos = cur_pos_, new_pos;
optional<int> arg_size;

Expand All @@ -236,14 +248,10 @@ bool ArgumentParser_aarch64::parse(Argument *dest) {
cur_pos_ = new_pos;
dest->base_register_name_ = reg_name;
} else if (arg_[cur_pos] == '[') {
// Parse ...@[<reg>] and ...@[<reg,<offset>]
optional<int> offset = 0;
std::string reg_name;
if (parse_mem(cur_pos + 1, new_pos, reg_name, &offset) == false)
// Parse ...@[<reg>], ...@[<reg,<offset>] and ...@[<reg>,<index_reg>]
if (parse_mem(cur_pos + 1, new_pos, dest) == false)
return false;
cur_pos_ = new_pos;
dest->base_register_name_ = reg_name;
dest->deref_offset_ = offset;
} else {
// Parse ...@<value>
optional<long long> val;
Expand Down

0 comments on commit bc810d5

Please sign in to comment.