Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gccrs: ensure packed and aligned is applied properly #3272

Merged
merged 1 commit into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions gcc/rust/backend/rust-compile-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "rust-gcc.h"

#include "tree.h"
#include "stor-layout.h"

namespace Rust {
namespace Compile {
Expand Down Expand Up @@ -268,8 +269,8 @@ TyTyResolveCompile::visit (const TyTy::ADTType &type)
fields.push_back (std::move (f));
}

type_record = type.is_union () ? Backend::union_type (fields)
: Backend::struct_type (fields);
type_record = type.is_union () ? Backend::union_type (fields, false)
: Backend::struct_type (fields, false);
}
else
{
Expand Down Expand Up @@ -359,7 +360,7 @@ TyTyResolveCompile::visit (const TyTy::ADTType &type)
}

// finally make the union or the enum
type_record = Backend::union_type (enum_fields);
type_record = Backend::union_type (enum_fields, false);
}

// Handle repr options
Expand All @@ -381,6 +382,7 @@ TyTyResolveCompile::visit (const TyTy::ADTType &type)
SET_TYPE_ALIGN (type_record, repr.align * 8);
TYPE_USER_ALIGN (type_record) = 1;
}
layout_type (type_record);

std::string named_struct_str
= type.get_ident ().path.get () + type.subst_as_string ();
Expand Down
6 changes: 3 additions & 3 deletions gcc/rust/rust-backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,11 +133,11 @@ function_ptr_type (tree result, const std::vector<tree> &praameters,

// Get a struct type.
tree
struct_type (const std::vector<typed_identifier> &fields);
struct_type (const std::vector<typed_identifier> &fields, bool layout = true);

// Get a union type.
tree
union_type (const std::vector<typed_identifier> &fields);
union_type (const std::vector<typed_identifier> &fields, bool layout = true);

// Get an array type.
tree
Expand Down Expand Up @@ -496,7 +496,7 @@ write_global_definitions (const std::vector<tree> &type_decls,
// TODO: make static

tree
fill_in_fields (tree, const std::vector<typed_identifier> &);
fill_in_fields (tree, const std::vector<typed_identifier> &, bool);

tree fill_in_array (tree, tree, tree);

Expand Down
15 changes: 9 additions & 6 deletions gcc/rust/rust-gcc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -592,23 +592,24 @@ function_ptr_type (tree result_type, const std::vector<tree> &parameters,
// Make a struct type.

tree
struct_type (const std::vector<typed_identifier> &fields)
struct_type (const std::vector<typed_identifier> &fields, bool layout)
{
return fill_in_fields (make_node (RECORD_TYPE), fields);
return fill_in_fields (make_node (RECORD_TYPE), fields, layout);
}

// Make a union type.

tree
union_type (const std::vector<typed_identifier> &fields)
union_type (const std::vector<typed_identifier> &fields, bool layout)
{
return fill_in_fields (make_node (UNION_TYPE), fields);
return fill_in_fields (make_node (UNION_TYPE), fields, layout);
}

// Fill in the fields of a struct or union type.

tree
fill_in_fields (tree fill, const std::vector<typed_identifier> &fields)
fill_in_fields (tree fill, const std::vector<typed_identifier> &fields,
bool layout)
{
tree field_trees = NULL_TREE;
tree *pp = &field_trees;
Expand All @@ -625,7 +626,9 @@ fill_in_fields (tree fill, const std::vector<typed_identifier> &fields)
pp = &DECL_CHAIN (field);
}
TYPE_FIELDS (fill) = field_trees;
layout_type (fill);

if (layout)
layout_type (fill);

// Because Rust permits converting between named struct types and
// equivalent struct types, for which we use VIEW_CONVERT_EXPR, and
Expand Down
Loading