Skip to content

Commit

Permalink
Merge pull request iovisor#1808 from iovisor/yhs_dev2
Browse files Browse the repository at this point in the history
adjust tracepoint field type based on size
  • Loading branch information
4ast authored Jun 11, 2018
2 parents eaf4f07 + 7c48946 commit d727b40
Showing 1 changed file with 44 additions and 2 deletions.
46 changes: 44 additions & 2 deletions src/cc/frontends/clang/tp_frontend_action.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,32 @@ static inline field_kind_t _get_field_kind(string const& line,
if (field_pos == string::npos)
return field_kind_t::invalid;

auto semi_pos = line.find(';', field_pos);
auto field_semi_pos = line.find(';', field_pos);
if (field_semi_pos == string::npos)
return field_kind_t::invalid;

auto offset_pos = line.find("offset:", field_semi_pos);
if (offset_pos == string::npos)
return field_kind_t::invalid;

auto semi_pos = line.find(';', offset_pos);
if (semi_pos == string::npos)
return field_kind_t::invalid;

auto size_pos = line.find("size:", semi_pos);
if (size_pos == string::npos)
return field_kind_t::invalid;

semi_pos = line.find(';', size_pos);
if (semi_pos == string::npos)
return field_kind_t::invalid;

auto size_str = line.substr(size_pos + 5,
semi_pos - size_pos - 5);
int size = std::stoi(size_str, nullptr);

auto field = line.substr(field_pos + 6/*"field:"*/,
semi_pos - field_pos - 6);
field_semi_pos - field_pos - 6);
auto pos = field.find_last_of("\t ");
if (pos == string::npos)
return field_kind_t::invalid;
Expand All @@ -83,6 +99,32 @@ static inline field_kind_t _get_field_kind(string const& line,
if (field_name.find("common_") == 0)
return field_kind_t::common;

// adjust the field_type based on the size of field
// otherwise, incorrect value may be retrieved for big endian
// and the field may have incorrect structure offset.
if (size == 2) {
if (field_type == "char" || field_type == "int8_t")
field_type = "s16";
if (field_type == "unsigned char" || field_type == "uint8_t")
field_type = "u16";
} else if (size == 4) {
if (field_type == "char" || field_type == "short" ||
field_type == "int8_t" || field_type == "int16_t")
field_type = "s32";
if (field_type == "unsigned char" || field_type == "unsiggned short" ||
field_type == "uint8_t" || field_type == "uint16_t")
field_type = "u32";
} else if (size == 8) {
if (field_type == "char" || field_type == "short" || field_type == "int" ||
field_type == "int8_t" || field_type == "int16_t" ||
field_type == "int32_t")
field_type = "s64";
if (field_type == "unsigned char" || field_type == "unsiggned short" ||
field_type == "unsigned int" || field_type == "uint8_t" ||
field_type == "uint16_t" || field_type == "uint32_t")
field_type = "u64";
}

return field_kind_t::regular;
}

Expand Down

0 comments on commit d727b40

Please sign in to comment.