diff options
Diffstat (limited to 'libcc1/libcc1plugin.cc')
-rw-r--r-- | libcc1/libcc1plugin.cc | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/libcc1/libcc1plugin.cc b/libcc1/libcc1plugin.cc index f1082d8..72d17c3 100644 --- a/libcc1/libcc1plugin.cc +++ b/libcc1/libcc1plugin.cc @@ -387,9 +387,10 @@ plugin_build_add_field (cc1_plugin::connection *, } int -plugin_finish_record_or_union (cc1_plugin::connection *, - gcc_type record_or_union_type_in, - unsigned long size_in_bytes) +plugin_finish_record_with_alignment (cc1_plugin::connection *, + gcc_type record_or_union_type_in, + unsigned long size_in_bytes, + unsigned long align) { tree record_or_union_type = convert_in (record_or_union_type_in); @@ -407,10 +408,10 @@ plugin_finish_record_or_union (cc1_plugin::connection *, } else { - // FIXME there's no way to get this from DWARF, - // or even, it seems, a particularly good way to deduce it. - SET_TYPE_ALIGN (record_or_union_type, - TYPE_PRECISION (pointer_sized_int_node)); + if (align == 0) + align = TYPE_PRECISION (pointer_sized_int_node); + + SET_TYPE_ALIGN (record_or_union_type, align); TYPE_SIZE (record_or_union_type) = bitsize_int (size_in_bytes * BITS_PER_UNIT); @@ -441,6 +442,15 @@ plugin_finish_record_or_union (cc1_plugin::connection *, return 1; } +int +plugin_finish_record_or_union (cc1_plugin::connection *conn, + gcc_type record_or_union_type_in, + unsigned long size_in_bytes) +{ + return plugin_finish_record_with_alignment (conn, record_or_union_type_in, + size_in_bytes, 0); +} + gcc_type plugin_build_enum_type (cc1_plugin::connection *self, gcc_type underlying_int_type_in) @@ -755,7 +765,7 @@ int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *) { - generic_plugin_init (plugin_info, GCC_C_FE_VERSION_1); + generic_plugin_init (plugin_info, GCC_C_FE_VERSION_2); register_callback (plugin_info->base_name, PLUGIN_PRAGMAS, plugin_init_extra_pragmas, NULL); |