blob: 544a6e38815a59c7a86d6e33b920680349588552 [file] [log] [blame]
/* 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);
}