Have driver_ast_parser report offset of record fields.

PiperOrigin-RevId: 660490627
This commit is contained in:
Anthony Cui
2024-08-07 12:25:44 -07:00
committed by gVisor bot
parent b0169e7024
commit 918a4d7089
3 changed files with 22 additions and 16 deletions
@@ -187,9 +187,14 @@ struct DriverStructReporter : public MatchFinder::MatchCallback {
absl::StrAppend(&field_type_name, "[", array_size, "]");
}
// getFieldOffset returns the size in bits, so we divide by 8 to get
// bytes.
uint64_t offset = ctx->getFieldOffset(field) / 8;
// Add field to json.
fields.push_back(json::object(
{{"name", field->getNameAsString()}, {"type", field_type_name}}));
fields.push_back(json::object({{"name", field->getNameAsString()},
{"type", field_type_name},
{"offset", offset}}));
// Recurse on the field type.
add_type_definition(field_type, base_type_name, ctx);
@@ -79,10 +79,10 @@ func TestParser(t *testing.T) {
Records: parser.RecordDefs{
"TestStruct": parser.RecordDef{
Fields: []parser.RecordField{
parser.RecordField{Name: "a", Type: "int"},
parser.RecordField{Name: "b", Type: "int"},
parser.RecordField{Name: "e", Type: "TestStruct::e_t[4]"},
parser.RecordField{Name: "f", Type: "TestUnion"},
parser.RecordField{Name: "a", Type: "int", Offset: 0},
parser.RecordField{Name: "b", Type: "int", Offset: 4},
parser.RecordField{Name: "e", Type: "TestStruct::e_t[4]", Offset: 8},
parser.RecordField{Name: "f", Type: "TestUnion", Offset: 40},
},
Size: 44,
IsUnion: false,
@@ -90,10 +90,10 @@ func TestParser(t *testing.T) {
},
"TestStruct2": parser.RecordDef{
Fields: []parser.RecordField{
parser.RecordField{Name: "a", Type: "int"},
parser.RecordField{Name: "b", Type: "int"},
parser.RecordField{Name: "e", Type: "TestStruct::e_t[4]"},
parser.RecordField{Name: "f", Type: "TestUnion"},
parser.RecordField{Name: "a", Type: "int", Offset: 0},
parser.RecordField{Name: "b", Type: "int", Offset: 4},
parser.RecordField{Name: "e", Type: "TestStruct::e_t[4]", Offset: 8},
parser.RecordField{Name: "f", Type: "TestUnion", Offset: 40},
},
Size: 44,
IsUnion: false,
@@ -101,8 +101,8 @@ func TestParser(t *testing.T) {
},
"TestStruct::e_t": parser.RecordDef{
Fields: []parser.RecordField{
parser.RecordField{Name: "c", Type: "OtherInt"},
parser.RecordField{Name: "d", Type: "OtherInt"},
parser.RecordField{Name: "c", Type: "OtherInt", Offset: 0},
parser.RecordField{Name: "d", Type: "OtherInt", Offset: 4},
},
Size: 8,
IsUnion: false,
@@ -110,8 +110,8 @@ func TestParser(t *testing.T) {
},
"TestUnion": parser.RecordDef{
Fields: []parser.RecordField{
parser.RecordField{Name: "u_a", Type: "int"},
parser.RecordField{Name: "u_b", Type: "int"},
parser.RecordField{Name: "u_a", Type: "int", Offset: 0},
parser.RecordField{Name: "u_b", Type: "int", Offset: 0},
},
Size: 4,
IsUnion: true,
@@ -50,8 +50,9 @@ func (a *OutputJSON) Merge(b OutputJSON) {
// RecordField represents a field in a record (struct or union).
type RecordField struct {
Name string
Type string
Name string
Type string
Offset uint64
}
func (s RecordField) String() string {