struct bcc_usdt_argument {
int size;
int valid;
- int constant;
+ long long constant;
int deref_offset;
const char *deref_ident;
const char *base_register_name;
class Argument {
private:
optional<int> arg_size_;
- optional<int> constant_;
+ optional<long long> constant_;
optional<int> deref_offset_;
optional<std::string> deref_ident_;
optional<std::string> base_register_name_;
return index_register_name_;
}
const optional<int> scale() const { return scale_; }
- const optional<int> constant() const { return constant_; }
+ const optional<long long> constant() const { return constant_; }
const optional<int> deref_offset() const { return deref_offset_; }
friend class ArgumentParser;
*result = number;
return endp - arg_;
}
+ ssize_t parse_number(ssize_t pos, optional<long long> *result) {
+ char *endp;
+ long long number = (long long)strtoull(arg_ + pos, &endp, 0);
+ if (endp > arg_ + pos)
+ *result = number;
+ return endp - arg_;
+ }
bool error_return(ssize_t error_start, ssize_t skip_start) {
print_error(error_start);
if (isspace(arg_[skip_start]))
const std::string &binpath,
const optional<int> &pid) const {
if (constant_) {
- tfm::format(stream, "%s = %d;", local_name, *constant_);
+ tfm::format(stream, "%s = %lld;", local_name, *constant_);
return true;
}
dest->deref_offset_ = offset;
} else {
// Parse ...@<value>
- optional<int> val;
+ optional<long long> val;
new_pos = parse_number(cur_pos, &val);
if (cur_pos == new_pos)
return error_return(cur_pos, cur_pos);
arg_str = &arg_[cur_pos_];
if (std::regex_search(arg_str, matches, arg_op_regex_const)) {
- dest->constant_ = stoi(matches.str(1));
+ dest->constant_ = (long long)stoull(matches.str(1));
} else if (std::regex_search(arg_str, matches, arg_op_regex_reg)) {
dest->base_register_name_ = "gpr[" + matches.str(1) + "]";
} else if (std::regex_search(arg_str, matches, arg_op_regex_breg_off)) {
cur_pos_ += matches.length(0);
if (std::regex_search(arg_ + cur_pos_, matches, arg_op_regex_imm)) {
- dest->constant_ = stoi(matches.str(1));
+ dest->constant_ = (long long)stoull(matches.str(1));
} else if (std::regex_search(arg_ + cur_pos_, matches, arg_op_regex_reg)) {
dest->base_register_name_ = "gprs[" + matches.str(1) + "]";
} else if (std::regex_search(arg_ + cur_pos_, matches, arg_op_regex_mem)) {
_fields_ = [
('size', ct.c_int),
('valid', ct.c_int),
- ('constant', ct.c_int),
+ ('constant', ct.c_longlong),
('deref_offset', ct.c_int),
('deref_ident', ct.c_char_p),
('base_register_name', ct.c_char_p),
using std::experimental::nullopt;
static void verify_register(USDT::ArgumentParser &parser, int arg_size,
- int constant) {
+ long long constant) {
USDT::Argument arg;
REQUIRE(parser.parse(&arg));
REQUIRE(arg.arg_size() == arg_size);
#elif defined(__x86_64__)
USDT::ArgumentParser_x64 parser(
"-4@$0 8@$1234 %rdi %rax %rsi "
+ "8@$9223372036854775806 8@$18446744073709551614 "
+ "-8@$-1 "
"-8@%rbx 4@%r12 8@-8(%rbp) 4@(%rax) "
"-4@global_max_action(%rip) "
"8@24+mp_(%rip) "
verify_register(parser, 8, "di");
verify_register(parser, 8, "ax");
verify_register(parser, 8, "si");
+ verify_register(parser, 8, 9223372036854775806ll);
+ verify_register(parser, 8, (long long)18446744073709551614ull);
+ verify_register(parser, -8, -1);
verify_register(parser, -8, "bx");
verify_register(parser, 4, "r12");