| /* Adjust alignment for local variable. |
| Copyright (C) 2020-2021 Free Software Foundation, Inc. |
| Contributed by Kito Cheng <kito.cheng@sifive.com> |
| |
| This file is part of GCC. |
| |
| GCC is free software; you can redistribute it and/or modify it under |
| the terms of the GNU General Public License as published by the Free |
| Software Foundation; either version 3, or (at your option) any later |
| version. |
| |
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GCC; see the file COPYING3. If not see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include "config.h" |
| #include "system.h" |
| #include "coretypes.h" |
| #include "backend.h" |
| #include "target.h" |
| #include "tree.h" |
| #include "tree-pass.h" |
| #include "memmodel.h" |
| #include "tm_p.h" |
| |
| namespace { |
| |
| const pass_data pass_data_adjust_alignment = |
| { |
| GIMPLE_PASS, /* type */ |
| "adjust_alignment", /* name */ |
| OPTGROUP_NONE, /* optinfo_flags */ |
| TV_NONE, /* tv_id */ |
| 0, /* properties_required */ |
| 0, /* properties_provided */ |
| 0, /* properties_destroyed */ |
| 0, /* todo_flags_start */ |
| 0, /* todo_flags_finish */ |
| }; |
| |
| class pass_adjust_alignment : public gimple_opt_pass |
| { |
| public: |
| pass_adjust_alignment (gcc::context *ctxt) |
| : gimple_opt_pass (pass_data_adjust_alignment, ctxt) |
| {} |
| |
| virtual unsigned int execute (function *); |
| }; // class pass_adjust_alignment |
| |
| } // anon namespace |
| |
| /* Entry point to adjust_alignment pass. */ |
| unsigned int |
| pass_adjust_alignment::execute (function *fun) |
| { |
| size_t i; |
| tree var; |
| |
| FOR_EACH_LOCAL_DECL (fun, i, var) |
| { |
| /* Don't adjust aligment for static local var and hard register var. */ |
| if (is_global_var (var) || DECL_HARD_REGISTER (var)) |
| continue; |
| |
| unsigned align = LOCAL_DECL_ALIGNMENT (var); |
| |
| /* Make sure alignment only increase. */ |
| gcc_assert (align >= DECL_ALIGN (var)); |
| |
| SET_DECL_ALIGN (var, align); |
| } |
| return 0; |
| } |
| |
| gimple_opt_pass * |
| make_pass_adjust_alignment (gcc::context *ctxt) |
| { |
| return new pass_adjust_alignment (ctxt); |
| } |