Merge pull request #1808 from iovisor/yhs_dev2
adjust tracepoint field type based on size
diff --git a/src/cc/frontends/clang/tp_frontend_action.cc b/src/cc/frontends/clang/tp_frontend_action.cc
index 3b46a62..c1b654a 100644
--- a/src/cc/frontends/clang/tp_frontend_action.cc
+++ b/src/cc/frontends/clang/tp_frontend_action.cc
@@ -62,7 +62,15 @@
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;
@@ -70,8 +78,16 @@
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;
@@ -83,6 +99,32 @@
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;
}