86 lines
2.2 KiB
C
86 lines
2.2 KiB
C
/* 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);
|
|
}
|