mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Have driver_ast_parser report offset of record fields.
PiperOrigin-RevId: 660490627
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user